如何检查JavaScript是否在某个数组索引处存在值?

2020/09/25 03:01 · javascript ·  · 0评论

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

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

从概念上讲,JavaScript中的数组包含array.length元素,array[0]直到为止array[array.length - 1]如果索引介于之间包括两端),i则将具有索引的数组元素定义为数组的一部分如果我不在此范围内,则不在数组中。i0array.length - 1

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

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

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

但是,您可能想要知道的是数组中的值是否确实定义了某些内容,即不是undefined也许你甚至想知道,如果它的定义,不是null可以在不设置成员值的情况下将其添加到数组中:例如,如果通过增加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
}  

我们不能只是这样做:

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

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

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

或者,我们可以使用:

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

简短而通用的方法

如果要检查任何数组是否具有伪造的值(例如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
}
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!='')})}

我建议创建这样的函数:

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:

  • 空值
  • 未定义
  • N
  • 空字符串
  • 0

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

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

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

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

但是,该属性index可以带有undefined存在如果要过滤掉这种情况,可以使用in运算符或hasOwnProperty,如如何检查对象在JavaScript中是否具有属性中所述。

index in array;
array.hasOwnProperty(index);

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

如果你知道数组不疏,你可以比较index使用array.length但是为了安全起见,您可能要确保index确实是数组索引,请参阅检查属性名称是否为数组索引

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

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
}

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

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

现在我们检查索引5处是否有6

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:不是数字

如果array [index]为null,请尝试

if (array[index] != null) 

使用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可以继续进行其他工作。

要检查它是否从未定义过或是否已删除:

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
}

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

好吧,数据表将其解释为一个数组(如果为空)和一个对象(如果不是),因此,以下解决方案对我有用:

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

对象没有length属性。

我认为此决定适合于喜欢声明式功能编程而不是命令式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

真实检测:in操作员

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

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

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

在此处输入图片说明

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

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

您可以使用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) ) });
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>

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

本文地址:http://javascript.askforanswer.com/ruhejianchajavascriptshifouzaimougeshuzusuoyinchucunzaizhi.html
文章标签: ,  
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!