如果某个数组索引中存在某个值,如何检入JavaScript?

时间:2010-04-20 03:41:50

标签: javascript arrays

这是否可用于测试位置“索引”的值是否存在,或者是否有更好的方法:

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

19 个答案:

答案 0 :(得分:725)

JavaScript中的所有数组都包含array.length个元素,从array[0]开始直到array[array.length - 1]。根据定义,如果i介于i0之间,则表示索引为array.length - 1的数组元素是数组的一部分。

也就是说,JavaScript数组是线性的,从零开始并达到最大值,并且数组没有从数组中排除某些值或范围的机制。要确定给定位置索引(索引是0还是正整数)中是否存在值,您只需使用

if (index < array.length) {
  // do stuff
}

但是, 可能使某些数组值为空,undefinedNaNInfinity,0或整个不同值的主机。例如,如果通过增加array.length属性来添加数组值,则任何新值都将为undefined

确定给定值是有意义的还是已定义的。也就是说, undefinednull

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

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

有趣的是,由于JavaScript的比较规则,我的上一个例子可以优化到这个:

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

答案 1 :(得分:350)

我们不能这样做:

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

答案 2 :(得分:40)

仅使用.length并不安全,并且会在某些浏览器中导致错误。这是一个更好的解决方案:

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

或者,我们可以使用:

Object.keys(__array__).length

答案 3 :(得分:20)

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

答案 4 :(得分:8)

简短且通用的方法

如果要检查任何数组是否有假值(如false,undefined,null或空字符串),您可以使用 every()方法,如下所示:

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

例如:

['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

如果你需要获得第一个假值的索引,你可以这样做:

let falsyIndex; 

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

如果您只需要检查给定索引的数组的虚假值,您可以这样做:

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

答案 5 :(得分:8)

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

答案 6 :(得分:6)

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

}else{
   println 'Null'
}

如果你的意思是'Null&#39; - &GT;它的元素为null或等于&#39;&#39; ,在这种情况下:在过滤所有&#39; null&#39;之后检查数组是否为空。元素

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

当然,在:

之前添加清洁方法
Array.prototype.clean=function(){return this.filter(function(e){return (typeof  e !=='undefined')&&(e!= null)&&(e!='')})}

答案 7 :(得分:5)

我建议创建一个这样的函数:

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

您可以这样称呼它:

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

强制开发人员遵守isEmptyEl接口将捕获输入错误,例如未定义的arrayName或indexVal变量。

(在Javascript编程时,防御性编程通常是一种很好的做法。)

如果未定义arrayName,您将收到类似这样的错误:

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)

未定义indexVal的类似结果。

如果数组或索引值不存在,则会出错。

对于有效输入,只有在arrayName [indexVal]为以下任何一项时才会得到true:

  • 未定义
  • 的NaN
  • 空字符串
  • 0

答案 8 :(得分:4)

这取决于你的意思&#34;空&#34;。

当您尝试在没有具有该名称的属性的对象上获取属性的值时,您将获得值undefined

稀疏数组会发生什么:不存在0array.length-1之间的所有索引。

因此,您可以检查array[index] === undefined

但是,属性index可能存在undefined值。如果您要过滤掉这种情况,可以使用in运算符或hasOwnProperty,如How do I check if an object has a property in JavaScript?

中所述
index in array;
array.hasOwnProperty(index);

如果您想要考虑不存在undefinednull值的现有属性,可以使用松散比较array[index] == undefinedarray[index] == null

如果您知道数组不稀疏,可以将indexarray.length进行比较。但为了安全起见,您可能希望确保index确实是数组索引,请参阅Check if property name is array index

答案 9 :(得分:0)

使用Lodash,您可以:

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

if(_.has(req,'documents'))是检查我们的请求对象是否具有名为documents的属性,如果它具有该支柱,则下一个if (req.documents.length)将验证它是否不是空数组,所以其他东西如forEach可以继续进行。

答案 10 :(得分:0)

检查它是否从未被定义或是否被删除:

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

也适用于删除了某些索引的关联数组和数组

要检查它是否从未被定义,被删除或者是空值或逻辑空值(NaN,空字符串,false):

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

答案 11 :(得分:0)

我使用laravel数据表遇到了这个问题。我在活动日志中存储了一个名为properties的JSON值,并希望显示一个基于此值为空的按钮。

好吧,datatables将它解释为一个数组(如果它是空的),如果不是一个对象,那么,以下解决方案对我有效:

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

对象没有长度属性。

答案 12 :(得分:0)

如果array [index]为null

,请尝试此操作
if (array[index] != null) 

答案 13 :(得分:0)

好的,让我们先看看如果JavaScript中不存在数组值会发生什么,所以如果我们有一个如下所示的数组:

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

现在我们检查 6 是否存在 5

arr[5];

我们得到了 undefined ...

所以这基本上给了我们答案,最好的方式检查是否未定义,所以像这样:

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

在这种情况下,这样做更好:

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

因为想象我们有这个数组:

const arr = [0, 1, 2];

我们这样做:

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

正如你所看到的那样,即使 0 ,它也没有被识别,很少有其他东西可以做同样的事情并让你的应用程序有问题,所以要小心,我将它们全部列出来:

  1. undefined :如果未定义该值并且undefined
  2. null :如果它为null,例如,如果DOM元素不存在...
  3. 空字符串''
  4. 0 :数字
  5. NaN :不是数字

答案 14 :(得分:0)

我想指出一些似乎错过的东西:即可能在数组中间有一个“空”数组位置。请考虑以下事项:

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

检查的自然方法是查看数组成员是否未定义,我不确定是否存在其他方法

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

答案 15 :(得分:0)

我认为这个决定适合那些喜欢声明式功能编程而不是命令式OOP或程序的人。如果您的问题是内部是否存在某些值?(真值或假值)” ,您可以使用.some方法来验证内部值。

[].some(el => el || !el);
  • 这不是完美的方法,但不需要应用任何包含相同逻辑的额外功能,例如function isEmpty(arr) { ... }
  • 当我们执行[].length导致0听起来很危险时,它听起来仍然比“长度为零吗?” 好。
  • 甚至是这个[].length > 0所说的“其长度是否大于零?”

高级示例:

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

答案 16 :(得分:0)

实际检测:in运算符

这个问题的年龄大约是10岁,令人惊讶的是没有人提起这个问题-但是,当我们使用delete运算符(例如here)时,有些人看到了这个问题。这也是一些反直观的解决方案,但是在“对象世界”中工作的in运算符也可以与数组一起使用(因为我们可以像在“键”上一样查看数组索引)。这样,我们可以检测并区分undefined数组值和delete删除的值(索引)

if(index in arrayName) {
   // do stuff 
}

let arr = [0, 1, 2, 3, null, undefined,6]

delete arr[2]; // we delete element at index=2

if(2 in arr) console.log('You will not see this because idx 2 was deleted');
if(5 in arr) console.log('This is element arr[5]:', arr[5]);



// Whole array and indexes bigger than arr.length:
for(let i=0; i<=9; i++) {
  let val = (i in arr) ? arr[i] : 'empty'
  let bound = i<arr.length ? '' : '(out of range)'
  console.log(`${i} value: `, val, bound);
}


console.log('Look on below aray on chrome console (not in SO snippet console)');
console.log('typeof arr:', typeof arr);
console.log(arr);

Chrome控制台会显示一些有关删除索引2的代码段数组的信息-该索引实际上根本不存在(!!!)(与从对象中删除键的方式相同)。这里有趣的是,数组被视为键值对(我们甚至看到了“长度”键)。有趣的是,typeof arr是对象(!!!),deletein运算符的工作方式类似于JS对象 (方括号表示法arr[idx]obj[key]也很相似)-因此看起来数组是核心中的一些特殊JS对象。

enter image description here

要获得类似的效果而无需delete定义数组,如下所示

[0, 1,, 3, null, undefined, 6] // pay attention to double comma: ",,"

答案 17 :(得分:0)

当您创建空数组时,值不是未定义的,它们是空的

var arr = new Array(10); // (10) [empty × 10]

但是当您按索引获取项目时会收到​​ undefined

arr[0]; // undefined

所以你不能通过 === 比较它们是否未定义或为空来知道

我们可以通过使用 JSON.stringify 来实现,转换整个数组它用 null 替换空值

JSON.stringify(arr); // "[null,null,null,null,null,null,null,null,null,null]"
JSON.stringify(arr[0]); // but for single item it returns undefined

真正检查空值:

arr[0] !== null && JSON.stringify(arr.map(item => !item)).slice(1, -1).split(',')[0] === 'null'
  1. 将 item 与 null 进行比较(应该不相等)
  2. 映射数组删除 false 而不是现有值(确保字符串化结构以逗号分隔,没有多余的逗号)
  3. JSON.stringify 数组
  4. 从字符串中删除括号
  5. 用逗号分割成数组
  6. 比较null

答案 18 :(得分:-1)

您可以使用Loadsh库更有效地执行此操作,例如:

如果您有一个名为&#34; pets&#34;的数组,例如:

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) ) });

检查所有数组值是否为null或未定义值:

&#13;
&#13;
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) ) });
&#13;
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
&#13;
&#13;
&#13;

查看http://underscorejs.org/

中的更多示例