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

How do I check in JavaScript if a value exists at a certain array index?

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

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


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

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

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

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

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

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
}


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

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:

  • 无效的
  • 未定义
  • 空字符串

这取决于你所说的"空"是什么意思。

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

这就是稀疏数组的情况:并非所有0array.length-1之间的索引都存在。

所以你可以检查一下array[index] === undefined

但是,财产index可以以undefined的价值存在。如果要过滤掉这种情况,可以使用in操作符或hasOwnProperty操作符,如"如何检查对象在javascript中是否具有属性"中所述?

1
2
index in array;
array.hasOwnProperty(index);

如果您希望考虑不存在具有undefinednull值的现有财产,可以使用松散比较array[index] == undefinedarray[index] == null

如果知道数组不是稀疏的,可以将indexarray.length进行比较。但为了安全起见,您可能希望确保index确实是一个数组索引,请参见检查属性名是否是数组索引。


我认为这个决定适合那些喜欢声明式函数编程而不是命令式OOP或过程式编程的人。如果你的问题是"里面有什么价值观吗?(Truthy或Falsy值)"您可以使用.some方法来验证内部值。

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 {
}

if(_.has(req,'documents'))是检查我们的请求对象是否有一个名为documents的属性,如果它有这个属性,下一个if (req.documents.length)是验证它是否不是空数组,这样其他的东西如forEach就可以继续了。


如果数组[索引]为空,请尝试此操作

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数据表遇到了这个问题。我在活动日志中存储了一个名为properties的JSON值,希望根据该值显示一个按钮,该按钮是否为空。

好吧,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];

我们得到undefined

所以这基本上是给我们答案,最好的方法来检查是否未定义,所以类似这样:

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也存在,它不会被识别,很少有其他事情可以做同样的事情,使你应用程序有缺陷,所以要小心,我把它们都列下来:

  • 未定义:如果该值未定义且为undefined
  • 空:如果它是空的,例如,如果一个dom元素不存在…
  • 空字符串:''
  • 0:数字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中的更多示例/