如果某个值存在于某个数组索引处,我如何检查 JavaScript?

Posted

技术标签:

【中文标题】如果某个值存在于某个数组索引处,我如何检查 JavaScript?【英文标题】:How do I check in JavaScript if a value exists at a certain array index? 【发布时间】:2011-02-09 23:19:06 【问题描述】:

这是否适用于测试位置 index 的值是否存在,或者是否有更好的方法:

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

【问题讨论】:

请注意,不是要检查整个数组是否为空,而是要检查索引值为“index”的某个位置 标题可以通过说“如果某个数组索引处存在值,我如何检查javascript”来改进标题。 【参考方案1】:

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

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

但是当你按索引获取项目时会收到​​未定义

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'
    将项目与 null 进行比较(应该不相等) map 数组删除 false 而不是现有值(确保字符串化结构以逗号分隔,没有多余的逗号) JSON.stringify 数组 从字符串中删除括号 用逗号分割成数组 与null比较

【讨论】:

【参考方案2】:

真实检测: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 的 sn-p 数组的信息 - 该索引实际上根本不存在(!!!)(与从对象中删除键的方式相同)。这里还有趣的是,数组被视为键值对(我们甚至可以看到“长度”键)。有趣的是,typeof arr 是 Object (!!!),deletein 运算符的作用类似于 JS 对象 (方括号符号arr[idx]obj[key] 也是类似的) - 所以看起来数组是核心中的一些特殊JS对象。

为了得到类似的效果,不用delete定义数组如下

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

【讨论】:

【参考方案3】:

从概念上讲,JavaScript 中的数组包含 array.length 元素,从 array[0] 开始直到 array[array.length - 1]。如果i 介于0array.length - 1 之间,则索引为i 的数组元素被定义为数组的一部分。如果 i 不在此范围内,则不在数组中。

所以从概念上讲,数组是线性的,从零开始到最大值,没有任何机制可以在不存在条目的范围内产生“间隙”。要找出给定位置索引处是否存在值(其中索引为 0 或正整数),您只需使用

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

现在,在底层,JavaScript 引擎几乎肯定不会像这样线性且连续地分配数组空间,因为它在动态语言中没有多大意义,并且对于某些代码来说效率低下。它们可能是哈希表或一些混合策略,并且数组的未定义范围可能没有分配自己的内存。尽管如此,JavaScript 该语言希望将 array.length n 的数组表示为具有 n 个成员,并将它们命名为 0n - 1,这个范围内的任何东西都是数组的一部分。

然而,您可能想要知道数组中的值是否实际上已定义 - 也就是说,它不是undefined。也许您甚至想知道它是否已定义,不是null。可以在不设置值的情况下将成员添加到数组中:例如,如果通过增加 array.length 属性来添加数组值,则任何新值都将为 undefined

确定给定值是否有意义或已定义。也就是说,不是undefined,或null

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
  

【讨论】:

OP 很可能知道他/她正在处理什么样的数组,但只是为了完整性:array-like 对象通常还包含 length 属性,在这种情况下,后两个例子更合适。 您可以随时将 foo !== 'undefined' &amp;&amp; foo !== null 替换为 foo != null @TheComposer 根据语言,Javascript 中数组的大小由array.length 定义,据说该数组包含从0array.length - 1 的所有元素。不过,并非所有这些值都是 defined 值。如果在数组成员上使用 delete 关键字,它将将该成员设置回未定义,就像通过增加其 array.length 参数来扩展数组一样,新值将以未定义开始。实际上,Javascript 实现可能会优化数组存储,部分或全部未定义的值可能不占用内存。 array.length 不会遍历任何内容,它只是一个数字。 此答案不涵盖未设置数组索引的情况。 new Array(1)[0] === undefined 但值为空。 [undefined][0] === undefined 但值已设置;数组一个值。唯一的完美答案是使用inhasOwnProperty()--idx in arrayarray.hasOwnProperty(idx)--per this answer:***.com/a/39171620/3120446【参考方案4】:

我认为这个决定适合那些更喜欢声明式函数式编程而不是命令式 OOP 或过程式编程的人。如果您的问题是里面有一些值吗?(真值或假值)”,您可以使用.some 方法来验证里面的值。

[].some(el => el || !el);
它并不完美,但不需要应用任何包含相同逻辑的额外函数,例如 function isEmpty(arr) ... 。 当我们这样做[].length 导致0 在某些情况下是危险的时,它仍然听起来比“它是零长度吗?”更好。 甚至这个[].length &gt; 0“它的长度是否大于零?”

高级示例:

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

【讨论】:

【参考方案5】:

我想指出一些似乎遗漏的东西:即可以在数组中间有一个“空”数组位置。考虑以下几点:

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

【讨论】:

【参考方案6】:

好的,让我们先看看如果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,它也不会被识别,很少有其他东西可以做同样的事情并使您的应用程序出现错误,所以要小心,我列出了它们全部下来:

    undefined:如果该值未定义且为undefined null:如果为null,例如如果DOM元素不存在... 空字符串'' 0:数字零 NaN:不是数字 错误

【讨论】:

【参考方案7】:

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

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

或者,我们可以使用:

Object.keys(__array__).length

【讨论】:

«请注意,不是要检查整个数组是否为空,而是要检查索引值为“index”的某个位置» 对于那些想要检查整个数组的人来说,这是一个简短而简单的答案 这个答案完全错过了OP问题,问题是查找数组索引是否为空,而不是整个数组!【参考方案8】:

短而通用的方法

如果您想检查任何数组是否具有虚假值(如 false、未定义、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

【讨论】:

【参考方案9】:

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

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

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

对象没有长度属性。

【讨论】:

【参考方案10】:

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

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

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

检查它是否从未被定义、被删除或为空或逻辑空值(NaN、空字符串、假):

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

【讨论】:

【参考方案11】:

我们不能这样做吗:

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

【讨论】:

问题是关于如何测试数组的特定索引是否存在。 if(arrayName.length) ... 会有什么不同吗? 为什么有这么多赞?这显然不能回答问题。 if(arrayName.length) ...null 上失败 这会失败,[undefined, undefined] 是一个长度为 2 的数组。【参考方案12】:

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

如果你有一个名为“pets”的数组,例如:

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

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

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

查看http://underscorejs.org/中的更多示例

【讨论】:

fn() 是一个语法错误,完全不清楚这如何帮助检查某个数组项是否存在于某个索引处。【参考方案13】:

使用 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) 是验证它是否不是一个空数组,所以其他的东西比如@987654325 @可以继续。

【讨论】:

【参考方案14】:

这取决于您对“空”的含义。

当您尝试获取没有同名属性的对象的属性值时,您将获得值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

【讨论】:

这是正确区分未设置数组项(没有任何值)和设置为未定义值的项的唯一答案。由于访问未设置的数组项返回未定义,这两种状态变得模糊,但它们是不同的。 当您的数组可能包含未设置的值(不同于 undefined 或 null)时,请使用 hasOwnProperty。【参考方案15】:

我建议创建这样的函数:

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 假

【讨论】:

【参考方案16】:

如果 array[index] 为空,试试这个

if (array[index] != null) 

【讨论】:

【参考方案17】:
if(typeof arr ==='object' && arr instanceof Array )
   if(!arr.length)
      println 'empty'
   else
      printn 'not Empty'
   

else
   println 'Null'

如果您的意思是 'Null' -> 它的元素为 null 或等于 '' ,在这种情况下:过滤所有 'null' 元素后检查数组是否为空

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

当然,在前面加上Clean方法:

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

【讨论】:

【参考方案18】:
if(arrayName.length > index && arrayName[index] !== null) 
    //arrayName[index] has a value

【讨论】:

@thomasrutter 我无法想出一种方法,最终可能会得到一个未定义的数组元素。 嗯,(myarray[1] = undefinedvariable) 有效吗?或者只是 (myarray[1] = undefined)? @thomasrutter 这两个都会抛出异常,不是吗? (未定义变量未定义) 您可以使用 Firebug 之类的工具自己测试它。在 Javascript 中,读取未定义变量的值不会引发异常——它会返回未定义的值。 @thomasrutter 你的第一条评论错了。 x == null 只会对 null 或 undefined 为真,没有别的。同样,x != null 将适用于任何既不是 null 也不是未定义的东西。除非您特别需要查找未定义,否则请倾向于隐式转换优点。【参考方案19】:
if(!arrayName[index])
     // do stuff

【讨论】:

如果数组值存在但为 0、null、"" 等,这也会起作用。 托马斯是对的;但是,这对于许多情况来说已经足够了(您可能应该列举出来)。 迄今为止最简单的方法

以上是关于如果某个值存在于某个数组索引处,我如何检查 JavaScript?的主要内容,如果未能解决你的问题,请参考以下文章

Flutter & Firebase:如何检查某个项目是不是存在于 Firebase 文档中的数组中

如何在 Oracle 查询中查找传递数组中某个值的索引

数组索引是不是存在

快速查找某个值是不是存在于 C 数组中?

php 中 判断数组中是不是有值

如何检查某个数据是不是已存在于firestore中