Đ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
}
Đ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
}
Câu trả lời:
Về mặt khái niệm, các mảng trong JavaScript chứa array.length
cá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 i
nằm giữa 0
và array.length - 1
bao 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ự là 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.length
tí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
}
length
tính, trong trường hợp hai ví dụ sau phù hợp hơn.
foo !== 'undefined' && foo !== null
bằng chỉfoo != null
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ớ.
new Array(1)[0] === undefined
nhưng giá trị trống rỗng. [undefined][0] === undefined
nhưng giá trị được đặt; mảng có giá trị. Câu trả lời hoàn hảo duy nhất là sử dụng in
hoặc hasOwnProperty()
- idx in array
hoặc array.hasOwnProperty(idx)
--per câu trả lời này: stackoverflow.com/a/39171620/3120446
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
}
if(arrayName.length) {...
làm cho bất kỳ sự khác biệt?
if(arrayName.length) {...
thất bại vàonull
[undefined, undefined]
một mảng có chiều dài = 2.
Chỉ sử dụng .length
khô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
if(!arrayName[index]){
// do stuff
}
if(arrayName.length > index && arrayName[index] !== null) {
//arrayName[index] has a value
}
x == null
sẽ 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 != null
sẽ đú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.
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
}
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!='')})}
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:
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 0
và array.length-1
tồ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 index
có thể tồn tại với một undefined
giá trị. Nếu bạn muốn lọc ra trường hợp này, bạn có thể sử dụng in
toá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 undefined
hoặc null
giá trị không tồn tại, bạn có thể sử dụng so sánh lỏng lẻo array[index] == undefined
hoặ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 index
với array.length
. Nhưng để an toàn, bạn có thể muốn đảm bảo rằng đó index
thự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
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ả:
undefined
''
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
}
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 documents
hay 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ư forEach
có thể được tiến hành.
Để 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
}
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.
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 .some
phương pháp để xác thực các giá trị bên trong.
[].some(el => el || !el);
function isEmpty(arr) { ... }
.[].length
dẫn đến 0
nguy hiểm trong một số trường hợp.[].length > 0
câ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
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.