Làm cách nào để kiểm tra JavaScript nếu một giá trị tồn tại ở một chỉ mục mảng nhất định?


521

Điều này có hoạt động để kiểm tra xem một giá trị tại vị trí "chỉ mục" có tồn tại hay không, hoặc có cách nào tốt hơn:

if(arrayName[index]==""){
     // do stuff
}

6
Xin lưu ý, không muốn kiểm tra xem toàn bộ mảng có trống không, chỉ cần một vị trí nhất định có giá trị chỉ mục là "chỉ mục"
Ankur

Tiêu đề có thể được cải thiện bằng cách nói "Làm cách nào để kiểm tra JavaScript nếu giá trị tồn tại ở một chỉ mục mảng nhất định".
demisx

Câu trả lời:


738

Về mặt khái niệm, các mảng trong JavaScript chứa array.lengthcác phần tử, bắt đầu array[0]cho đến khi array[array.length - 1]. Một phần tử mảng có chỉ mục iđược xác định là một phần của mảng nếu inằm giữa 0array.length - 1bao gồm. Nếu tôi không ở trong phạm vi này thì nó không nằm trong mảng.

Vì vậy, theo khái niệm, các mảng là tuyến tính, bắt đầu bằng 0 và đi đến mức tối đa, không có bất kỳ cơ chế nào để có "khoảng trống" trong phạm vi đó, nơi không có mục nào tồn tại. Để tìm hiểu xem giá trị có tồn tại ở một chỉ mục vị trí nhất định không (trong đó chỉ số là 0 hoặc số nguyên dương), bạn chỉ cần sử dụng theo nghĩa đen

if (i >= 0 && i < array.length) {
  // it is in array
}

Bây giờ, dưới vỏ bọc, các công cụ JavaScript gần như chắc chắn sẽ không phân bổ không gian mảng một cách tuyến tính và liên tục như thế này, vì nó sẽ không có ý nghĩa nhiều trong một ngôn ngữ động và nó sẽ không hiệu quả đối với một số mã nhất định. Chúng có thể là bảng băm hoặc một số hỗn hợp chiến lược hỗn hợp và phạm vi không xác định của mảng có thể không được cấp phát bộ nhớ của riêng chúng. Tuy nhiên, JavaScript ngôn ngữ muốn trình bày các mảng của array.length n là có n thành viên và chúng được đặt tên từ 0 đến n - 1 và mọi thứ trong phạm vi này là một phần của mảng.

Tuy nhiên, điều bạn có thể muốn là biết liệu một giá trị trong một mảng có thực sựmột cái gì đó được xác định hay không - nghĩa là không phải vậy undefined. Có lẽ bạn thậm chí muốn biết nếu nó được xác định và khôngnull . Có thể thêm thành viên vào một mảng mà không bao giờ đặt giá trị của chúng: ví dụ: nếu bạn thêm giá trị mảng bằng cách tăng thuộc array.lengthtính, mọi giá trị mới sẽ có undefined.

Để xác định xem một giá trị nhất định có phải là một cái gì đó có ý nghĩa hay đã được xác định. Đó là, không undefined , hoặc null:

if (typeof array[index] !== 'undefined') {

hoặc là

if (typeof array[index] !== 'undefined' && array[index] !== null) {

Thật thú vị, vì các quy tắc so sánh của JavaScript, ví dụ cuối cùng của tôi có thể được tối ưu hóa theo cách này:

if (array[index] != null) {
  // The == and != operators consider null equal to only null or undefined
}  

6
Rất có khả năng OP biết loại mà anh ấy đang xử lý, nhưng chỉ để hoàn thiện: các đối tượng giống như mảng cũng thường chứa một thuộc lengthtính, trong trường hợp hai ví dụ sau phù hợp hơn.
Justin Johnson

9
bạn luôn có thể thay thế foo !== 'undefined' && foo !== nullbằng chỉfoo != null
thinklinux

1
@TheComposer theo ngôn ngữ kích thước của một mảng trong Javascript được xác định bởi mảng.length và mảng được cho là bao gồm tất cả các phần tử từ 0đến array.length - 1. Không phải tất cả các giá trị này sẽ được xác định giá trị mặc dù. Nếu bạn sử dụng từ khóa xóa trên một thành viên mảng, nó sẽ đặt thành viên đó trở lại không xác định, giống như nếu bạn mở rộng một mảng bằng cách tăng tham số Array.length của nó, các giá trị mới sẽ bắt đầu như không xác định. Trong thực tế, việc triển khai Javascript có thể sẽ tối ưu hóa lưu trữ mảng và một số hoặc tất cả các giá trị không xác định có thể không chiếm bộ nhớ.
thomasrutter

1
mảng.length không lặp lại bất cứ điều gì, nó chỉ là một số duy nhất.
thomasrutter

1
Câu trả lời này không bao gồm các trường hợp chỉ số mảng không được đặt. new Array(1)[0] === undefinednhưng giá trị trống rỗng. [undefined][0] === undefinednhưng giá trị được đặt; mảng giá trị. Câu trả lời hoàn hảo duy nhất là sử dụng inhoặc hasOwnProperty()- idx in arrayhoặc array.hasOwnProperty(idx)--per câu trả lời này: stackoverflow.com/a/39171620/3120446
dx_over_dt

350

Chúng ta không thể làm điều này:

if(arrayName.length > 0){   
    //or **if(arrayName.length)**
    //this array is not empty 
}else{
   //this array is empty
}

10
Câu hỏi là về cách kiểm tra xem một chỉ mục cụ thể của một mảng có tồn tại hay không.
thomasrutter

26
Sẽ if(arrayName.length) {...làm cho bất kỳ sự khác biệt?
siannone

10
Tại sao rất nhiều upvote? Điều này rõ ràng không trả lời câu hỏi.
algiogia

10
if(arrayName.length) {...thất bại vàonull
Ronnie Royston

5
điều này không thành công với [undefined, undefined]một mảng có chiều dài = 2.
Soldeplata Saketos

41

Chỉ sử dụng .lengthkhông an toàn và sẽ gây ra lỗi trong một số trình duyệt. Đây là một giải pháp tốt hơn:

if(array && array.length){   
   // not empty 
} else {
   // empty
}

hoặc, chúng ta có thể sử dụng:

Object.keys(__array__).length

2
«Xin lưu ý, không muốn kiểm tra xem toàn bộ mảng có trống không, chỉ là một vị trí nhất định có giá trị chỉ mục là" chỉ mục "»
Oriol

câu trả lời hay, ngắn gọn và đơn giản cho những ai muốn kiểm tra toàn bộ mảng
Luis Martins

23
if(!arrayName[index]){
     // do stuff
}

8
Điều này cũng sẽ làm công cụ nếu giá trị mảng tồn tại nhưng là 0, null, "", v.v.
thomasrutter

Thomas nói đúng; tuy nhiên, điều này là đủ cho nhiều trường hợp (mà bạn có lẽ nên liệt kê).
Justin Johnson

cho đến nay cách đơn giản nhất
kẻ phá vỡ

8
if(arrayName.length > index && arrayName[index] !== null) {
    //arrayName[index] has a value
}

@thomasrutter Tôi gặp khó khăn khi đưa ra một cách có thể kết thúc bằng một phần tử mảng không xác định.
Rex M

Hmmm, (myarray [1] = không xác định) có hoạt động không? Hay chỉ (myarray [1] = không xác định)?
thomasrutter

@thomasrutter cả hai sẽ ném một ngoại lệ, không? (không xác định được là không xác định)
Rex M

1
Bạn có thể tự kiểm tra nó bằng cách sử dụng một cái gì đó như Fireorms. Trong Javascript, việc đọc giá trị của một biến không xác định sẽ không đưa ra một ngoại lệ - nó trả về giá trị không xác định.
thomasrutter

@thomasrutter bạn sai trong bình luận đầu tiên của bạn. x == nullsẽ chỉ đúng với null hoặc không xác định, không có gì khác. Tương tự như vậy, x != nullsẽ đúng với bất kỳ thứ gì không có giá trị hoặc không xác định. Trừ khi bạn đặc biệt cần tìm kiếm không xác định, chỉ cần dựa vào lòng tốt chuyển đổi ngầm định.
Marcus Stade

8

Cách tiếp cận ngắn và phổ quát

Nếu bạn muốn kiểm tra bất kỳ mảng nào nếu nó có các giá trị giả (như sai, không xác định, null hoặc chuỗi rỗng), bạn chỉ có thể sử dụng mọi phương thức () như thế này:

array.every(function(element) {return !!element;}); // returns true or false

Ví dụ:

['23', null, 2, {key: 'value'}].every(function(element) {return !!element;}); // returns false

['23', '', 2, {key: 'value'}].every(function(element) {return !!element;}); // returns false

['23', true, 2, {key: 'value'}].every(function(element) {return !!element;}); // returns true

Nếu bạn cần lấy chỉ số đầu tiên của giá trị giả, bạn có thể làm như thế này:

let falsyIndex; 

if(!['23', true, 2, null, {key: 'value'}].every(function(element, index) {falsyIndex = index; return !!element;})) {
  console.log(falsyIndex);
} // logs 3

Nếu bạn chỉ cần kiểm tra giá trị giả của một mảng cho một chỉ mục nhất định, bạn có thể làm như thế này:

if (!!array[index]) {
  // array[index] is a correct value
}
else {
  // array[index] is a falsy value
}

6
if(typeof arr ==='object' && arr instanceof Array ){
   if(!arr.length){
      println 'empty'
   }else{
      printn 'not Empty'
   }

}else{
   println 'Null'
}

Nếu bạn có nghĩa là 'Null' -> Các phần tử của nó là null hoặc bằng '', trong trường hợp này: Kiểm tra xem mảng có trống không sau khi lọc tất cả các phần tử 'null'

if(!arr.clean().length){return 'is null'}

Tất nhiên, phương pháp Add Clean trước:

Array.prototype.clean=function(){return this.filter(function(e){return (typeof  e !=='undefined')&&(e!= null)&&(e!='')})}

5

Tôi khuyên bạn nên tạo một chức năng như thế này:

function isEmptyEl(array, i) {
   return !(array[i]);
}

Bạn có thể gọi nó như thế này:

if (isEmptyEl(arrayName, indexVal)) {
   console.log('arrayName[' + indexVal + '] is empty');
}

Việc buộc nhà phát triển tuân thủ giao diện isEmptyEl sẽ bắt các lỗi đầu vào, chẳng hạn như một biến ArrayName hoặc indexVal không xác định.

(Nói chung là thực hành tốt để lập trình phòng thủ khi lập trình bằng Javascript.)

Bạn sẽ nhận được một lỗi ném như thế này nếu mảngName không được xác định:

Uncaught ReferenceError: arrayName is not defined
    at <anonymous>:2:15
    at Object.InjectedScript._evaluateOn (<anonymous>:895:140)
    at Object.InjectedScript._evaluateAndWrap (<anonymous>:828:34)
    at Object.InjectedScript.evaluate (<anonymous>:694:21)

Kết quả tương tự cho một indexVal không xác định.

Bạn gặp lỗi nếu các giá trị mảng hoặc chỉ mục không tồn tại.

Đối với đầu vào hợp lệ, bạn sẽ chỉ nhận được đúng nếu mảngName [indexVal] là một trong những điều sau đây:

  • vô giá trị
  • chưa xác định
  • NaN
  • chuỗi rỗng
  • 0
  • sai

5

Nó phụ thuộc vào những gì bạn có nghĩa là "trống rỗng".

Khi bạn cố gắng lấy giá trị của một thuộc tính trên một đối tượng không có thuộc tính có tên đó, bạn sẽ nhận được giá trị undefined.

Đó là những gì xảy ra với các mảng thưa thớt: không phải tất cả các chỉ số giữa 0array.length-1tồn tại.

Vì vậy, bạn có thể kiểm tra nếu array[index] === undefined.

Tuy nhiên, tài sản indexcó thể tồn tại với một undefinedgiá trị. Nếu bạn muốn lọc ra trường hợp này, bạn có thể sử dụng intoán tử hoặc hasOwnProperty, như được mô tả trong Làm cách nào để kiểm tra xem một đối tượng có thuộc tính trong JavaScript không?

index in array;
array.hasOwnProperty(index);

Nếu bạn muốn xem xét một tài sản hiện có với một undefinedhoặc nullgiá trị không tồn tại, bạn có thể sử dụng so sánh lỏng lẻo array[index] == undefinedhoặc array[index] == null.

Nếu bạn biết mảng không thưa thớt, bạn có thể so sánh indexvới array.length. Nhưng để an toàn, bạn có thể muốn đảm bảo rằng đó indexthực sự là một chỉ mục mảng, hãy xem Kiểm tra xem tên thuộc tính có phải là chỉ mục mảng không


2
Đây là câu trả lời duy nhất phân biệt chính xác giữa các mục không đặt (không có giá trị nào) và các mục được đặt thành giá trị không xác định. Hai trạng thái bị mờ bởi thực tế là việc truy cập vào một mục mảng chưa đặt sẽ trả về không xác định, nhưng chúng khác nhau.
olivr

Sử dụng hasOwnProperty khi bạn có một mảng với các giá trị chưa được đặt (khác với không xác định hoặc null).
CMCDragonkai

1

OK, trước tiên hãy xem điều gì sẽ xảy ra nếu một giá trị mảng không tồn tại trong JavaScript, vì vậy nếu chúng ta có một mảng như dưới đây:

const arr = [1, 2, 3, 4, 5];

và bây giờ chúng tôi kiểm tra xem 6 có ở chỉ số 5 hay không:

arr[5];

và chúng ta có undefined...

Vì vậy, về cơ bản là cho chúng ta câu trả lời, cách tốt nhất để kiểm tra nếu không xác định, vì vậy một cái gì đó như thế này:

if("undefined" === typeof arrayName[index]) {
  //array value is not there...
}

Tốt hơn là KHÔNG làm điều này trong trường hợp này:

if(!arrayName[index]) {
  //Don't check like this..
}

Bởi vì hãy tưởng tượng chúng ta có mảng này:

const arr = [0, 1, 2];

và chúng tôi làm:

if(!arr[0]) {
  //This get passed, because in JavaScript 0 is falsy
}

Vì vậy, như bạn thấy, thậm chí 0 ở đó, nó không được công nhận, có một số điều khác có thể làm tương tự và làm cho ứng dụng của bạn bị lỗi, vì vậy hãy cẩn thận, tôi liệt kê tất cả:

  1. không xác định : nếu giá trị không được xác định và nóundefined
  2. null : nếu nó là null, ví dụ nếu một phần tử DOM không tồn tại ...
  3. chuỗi rỗng :''
  4. 0 : số không
  5. NaN : không phải là số
  6. sai

1

Tôi muốn chỉ ra một vài thứ dường như đã bỏ lỡ: cụ thể là có thể có một vị trí mảng "trống" ở giữa mảng của bạn. Hãy xem xét những điều sau đây:

let arr = [0, 1, 2, 3, 4, 5]

delete arr[3]

console.log(arr)      // [0, 1, 2, empty, 4, 5]

console.log(arr[3])   // undefined

Cách tự nhiên để kiểm tra sau đó là xem liệu thành viên mảng không được xác định, tôi không chắc chắn nếu các cách khác tồn tại

if (arr[index] === undefined) {
  // member does not exist
}

0

Hãy thử điều này nếu mảng [index] là null

if (array[index] != null) 

0

Với Lodash, bạn có thể làm:

if(_.has(req,'documents')){
      if (req.documents.length)
      _.forEach(req.documents, function(document){
        records.push(document);
      });
} else {
}

if(_.has(req,'documents'))là để kiểm tra xem đối tượng yêu cầu của chúng ta có thuộc tính được đặt tên documentshay không và nếu nó có prop đó, việc tiếp theo if (req.documents.length)là xác thực nếu nó không phải là một mảng trống, vì vậy những thứ khác như forEachcó thể được tiến hành.


0

Để kiểm tra xem nó chưa bao giờ được xác định hoặc nếu nó đã bị xóa:

if(typeof arrayName[index]==="undefined"){
     //the index is not in the array
}

cũng hoạt động với các mảng và mảng kết hợp nơi bạn đã xóa một số chỉ mục

Để kiểm tra xem nó chưa bao giờ được xác định, đã bị xóa HOẶC là giá trị rỗng rỗng hoặc logic (NaN, chuỗi rỗng, sai):

if(typeof arrayName[index]==="undefined"||arrayName[index]){
     //the index is not defined or the value an empty value
}

0

Tôi gặp vấn đề này bằng cách sử dụng dữ liệu laravel. Tôi đã lưu trữ một giá trị JSON được gọi làproperties trong nhật ký hoạt động và muốn hiển thị một nút dựa trên giá trị này có trống hay không.

Chà, datatables đã diễn giải điều này như một mảng nếu nó trống và một đối tượng nếu nó không phải, do đó, giải pháp sau đây có hiệu quả với tôi:

render: function (data, type, full) {
    if (full.properties.length !== 0) {
        // do stuff
    }
}

Một đối tượng không có thuộc tính chiều dài.


0

Tôi nghĩ rằng quyết định này là phù hợp cho những người thích lập trình chức năng khai báo hơn OOP bắt buộc hoặc thủ tục. Nếu câu hỏi của bạn là " Có một số giá trị bên trong không? ( Một giá trị trung thực hoặc sai lệch)", bạn có thể sử dụng .somephương pháp để xác thực các giá trị bên trong.

[].some(el => el || !el);
  • Nó không hoàn hảo nhưng nó không yêu cầu áp dụng bất kỳ chức năng bổ sung nào có cùng logic, như thế function isEmpty(arr) { ... }.
  • Nó vẫn có vẻ tốt hơn "Có độ dài bằng không?" khi chúng ta làm điều này [].lengthdẫn đến 0nguy hiểm trong một số trường hợp.
  • Hoặc thậm chí [].length > 0câu nói này "Có phải chiều dài của nó lớn hơn không?"

Ví dụ nâng cao:

[    ].some(el => el || !el); // false
[null].some(el => el || !el); // true
[1, 3].some(el => el || !el); // true

-1

Bạn có thể sử dụng thư viện Loadsh để thực hiện việc này hiệu quả hơn, như:

nếu bạn có một mảng có tên là "vật nuôi", ví dụ:

var pets = ['dog', undefined, 'cat', null];

console.log(_.isEmpty(pets[1])); // true
console.log(_.isEmpty(pets[3])); // true
console.log(_.isEmpty(pets[4])); // false

_.map( pets, (pet, index) => { console.log(index + ': ' + _.isEmpty(pet) ) });

Để kiểm tra tất cả các giá trị mảng cho các giá trị null hoặc không xác định:

var pets = ['dog', undefined, 'cat', null];

console.log(_.isEmpty(pets[1])); // true
console.log(_.isEmpty(pets[3])); // true
console.log(_.isEmpty(pets[4])); // false

_.map( pets, (pet, index) => { console.log(index + ': ' + _.isEmpty(pet) ) });
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>

Kiểm tra các ví dụ khác trong http://underscorejs.org/


fn(){}là một lỗi cú pháp và hoàn toàn không rõ cách thức này giúp kiểm tra xem một mục mảng có tồn tại ở một chỉ mục nhất định hay không.
Oriol
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.