How do I check in JavaScript if a value exists at a certain array index?
这是否适用于测试位置"索引"处的值是否存在,或者是否有更好的方法:
1 2 3 | if(arrayName[index]==""){ // do stuff } |
javascript中的所有数组都包含
也就是说,javascript数组是线性的,从零开始到最大值,并且数组没有从数组中排除某些值或范围的机制。要找出给定位置索引(索引为0或正整数)中是否存在值,您只需使用
1 2 3 | if (index < array.length) { // do stuff } |
但是,有些数组值可能为空、
确定给定值是有意义的还是已定义的。也就是说,不是
1 | if (typeof array[index] !== 'undefined') { |
。
或
1 | if (typeof array[index] !== 'undefined' && array[index] !== null) { |
有趣的是,由于javascript的比较规则,我的上一个示例可以优化为:
1 2 3 | if (array[index] != null) { // The == and != operators consider null equal to only null or undefined } |
。
我们不能这样做吗?
1 2 3 4 5 6 | if(arrayName.length > 0){ //or **if(arrayName.length)** //this array is not empty }else{ //this array is empty } |
。
仅使用
1 2 3 4 5 | if(array && array.length){ // not empty } else { // empty } |
号
或者,我们可以使用:
1 | Object.keys(__array__).length |
号
1 2 3 | if(!arrayName[index]){ // do stuff } |
号
短而通用的方法
如果您想检查任何数组是否有错误的值(如假、未定义、空或空字符串),您可以使用如下的every()方法:
1 | array.every(function(element) {return !!element;}); // returns true or false |
号
例如:
1 2 3 4 5 | ['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 |
如果你需要得到一个错误值的第一个索引,你可以这样做:
1 2 3 4 5 | let falsyIndex; if(!['23', true, 2, null, {key: 'value'}].every(function(element, index) {falsyIndex = index; return !!element;})) { console.log(falsyIndex); } // logs 3 |
。
如果您只需要检查给定索引的数组的错误值,可以这样做:
1 2 3 4 5 6 | if (!!array[index]) { // array[index] is a correct value } else { // array[index] is a falsy value } |
1 2 3 | if(arrayName.length > index && arrayName[index] !== null) { //arrayName[index] has a value } |
1 2 3 4 5 6 7 8 9 10 | if(typeof arr ==='object' && arr instanceof Array ){ if(!arr.length){ println 'empty' }else{ printn 'not Empty' } }else{ println 'Null' } |
如果您的意思是"空"->它的元素为空或等于"",在这种情况下:在筛选所有"空"元素后检查数组是否为空
1 | if(!arr.clean().length){return 'is null'} |
。
当然,在下面之前加上清洁方法:
1 | Array.prototype.clean=function(){return this.filter(function(e){return (typeof e !=='undefined')&&(e!= null)&&(e!='')})} |
我建议创建这样的函数:
1 2 3 | function isEmptyEl(array, i) { return !(array[i]); } |
号
你可以这样称呼它:
1 2 3 | if (isEmptyEl(arrayName, indexVal)) { console.log('arrayName[' + indexVal + '] is empty'); } |
号
强制开发人员遵循isEmptYel接口将捕获未定义的arrayName或indexVal变量等输入错误。
(在用javascript编程时,防御性编程通常是一种良好的实践。)
如果未定义arrayName,则会出现如下错误:
1 2 3 4 5 | Uncaught ReferenceError: arrayName is not defined at :2:15 at Object.InjectedScript._evaluateOn (:895:140) at Object.InjectedScript._evaluateAndWrap (:828:34) at Object.InjectedScript.evaluate (:694:21) |
号
未定义indexval的类似结果。
如果数组或索引值不存在,则会出现错误。
对于有效输入,只有当arrayname[indexval]为以下任一项时,才会得到true:
- 无效的
- 未定义
- 南
- 空字符串
- 零
- 假
这取决于你所说的"空"是什么意思。
当您试图在没有该名称属性的对象上获取属性的值时,您将获得值
这就是稀疏数组的情况:并非所有
所以你可以检查一下
但是,财产
1 2 | index in array; array.hasOwnProperty(index); |
号
如果您希望考虑不存在具有
如果知道数组不是稀疏的,可以将
我认为这个决定适合那些喜欢声明式函数编程而不是命令式OOP或过程式编程的人。如果你的问题是"里面有什么价值观吗?(Truthy或Falsy值)"您可以使用
1 | [].some(el => el || !el); |
号
- 它并不完美,但不需要应用任何包含相同逻辑的额外函数,如
function isEmpty(arr) { ... } 。 - 听起来还是比"它是零长度的吗?"当我们这样做时,
[].length 导致0 在某些情况下是危险的。 - 或者甚至是这个
[].length > 0 说的"它的长度是否大于零?"
高级示例:
1 2 3 | [ ].some(el => el || !el); // false [null].some(el => el || !el); // true [1, 3].some(el => el || !el); // true |
号
有了罗达什,你可以做到:
1 2 3 4 5 6 7 | if(_.has(req,'documents')){ if (req.documents.length) _.forEach(req.documents, function(document){ records.push(document); }); } else { } |
如果数组[索引]为空,请尝试此操作
1 | if (array[index] != null) |
。
要检查它是否从未定义或是否已被删除,请执行以下操作:
1 2 3 | if(typeof arrayName[index]==="undefined"){ //the index is not in the array } |
。
也可用于删除某些索引的关联数组和数组
要检查它是否从未被定义、删除或是空值或逻辑空值(NaN、空字符串、假):
1 2 3 | if(typeof arrayName[index]==="undefined"||arrayName[index]){ //the index is not defined or the value an empty value } |
号
我使用Laravel数据表遇到了这个问题。我在活动日志中存储了一个名为
好吧,DataTables将它解释为一个数组(如果它是空的)和一个对象(如果它不是空的),因此,下面的解决方案适用于我:
1 2 3 4 5 | render: function (data, type, full) { if (full.properties.length !== 0) { // do stuff } } |
对象没有长度属性。
好吧,让我们先看看如果一个数组值不存在于javascript中会发生什么,那么如果我们有一个如下的数组:
1 | const arr = [1, 2, 3, 4, 5]; |
。
现在我们检查索引5是否有6:
1 | arr[5]; |
。
我们得到
所以这基本上是给我们答案,最好的方法来检查是否未定义,所以类似这样:
1 2 3 | if("undefined" === typeof arrayName[index]) { //array value is not there... } |
在这种情况下最好不要这样做:
1 2 3 | if(!arrayName[index]) { //Don't check like this.. } |
。
因为假设我们有这个数组:
1 | const arr = [0, 1, 2]; |
我们做到了:
1 2 3 | if(!arr[0]) { //This get passed, because in JavaScript 0 is falsy } |
。
所以,正如你所看到的,即使是0也存在,它不会被识别,很少有其他事情可以做同样的事情,使你应用程序有缺陷,所以要小心,我把它们都列下来:
我想指出一些似乎遗漏了的东西:也就是说,有可能在数组中间有一个"空"的数组位置。考虑以下内容:
1 2 3 4 5 6 7 | 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 |
号
检查数组成员的自然方法是查看数组成员是否未定义,我不确定是否存在其他方法。
1 2 3 | if (arr[index] === undefined) { // member does not exist } |
号
您可以使用loadsh库更有效地执行此操作,例如:
如果您有一个名为"pets"的数组,例如:
1 2 3 4 5 6 7 | 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) ) }); |
号
要检查所有数组值的空值或未定义值,请执行以下操作:
1 2 3 4 5 6 7 | 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) ) }); |
号
1 | <script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"> |
号
查看http://underlinejs.org中的更多示例/