如何在数组中找到缺失值的索引?

我有一个像这样的数组

a=[1,2,3,,4,5]; 

所以现在我想使用indexOf找到缺失值索引,即3

检查值是否undefined如下面的代码:

 for ( var i = 0; i < a.length; i++ ) { if ( typeof a[i] === "undefined" ) { // do stuff here or break the loop } } 

更新您也可以这样做:

 Array.prototype.indexOfUndefined = function() { for ( var i = 0; i < this.length; i++ ) { if ( typeof this[i] === "undefined" ) { return i; } } } 

您需要返回i因为i是当前索引,它将搜索第一个undefined值。

演示: http : //jsfiddle.net/vdyypq6o/5/

不幸的是,ES5 Array方法需要*来跳过这样的数组漏洞**,所以没有indexOf()forEach()会有所帮助。 ECMAScript 2015有两个名为find()findIndex()新方法可以帮到你,但它们还没有被广泛支持 ,所以我认为这个问题不是一个好的答案。

剩下的是对索引的一个很好的旧迭代:

 function findHole(a) { for (var i = 0; i < a.length; i++) { // check for only `a[i] === undefined` could be faster, // but is not enough as it will cause false positives // when array actually contains `undefined` value // for example, for `a = [1, undefined, , 2]`, // correct implementation should return `2`, not `1` if (a[i] === undefined && !a.hasOwnProperty(i)) { console.log("Found hole at index " + i); return i; } } return -1; } 

* - 参见http://www.ecma-international.org/ecma-262/5.1/#sec-15.4.4.14中的indexOf()和步骤8中的步骤9 http://www.ecma-international.org/ecma -262 / 5.1 /#sec-15.4.4.19用于需要跳过孔的map()算法

** - 当没有为某个索引定义值时,在数组中创建一个洞,所以从技术上讲, a[3]具有nullundefined值,那是不正确的,因为没有任何值。 但是在JavaScript中,当我们尝试获取某个对象的未定义属性时,我们得到的是undefined ,为什么a[3] === undefined为真。

 a = [1,2,3,,4,5]; i = 0; $.each(a , (function(){ if(a[i]=="") { alert(i + ":: yes this is null index"); } i++; }); 

你可以使用每个循环来达到这个目的。 可能在市场上有更多的解决方案用于此目的:P但这也是一个很好的解决方案。 你应该试试这个。

只需添加另一种方法来实现您的需求 –

 for ( var i = 0; i < a.length; i++ ) { if (!a[i]) { console.log("Null index = ",i); } } 

你可以试试这个

  a=['1','2','3',,'4'] for(var i=0;i"+i) } 

还有另一种减少function的方法,获取所有错过的值。

 function findMissed(arr){ var result = arr.reduce(function(acc,el,index){ if(index - acc.cur > 1) { for(var i=acc.cur+1;i < index;i++){ acc.res.push(i); } } acc.cur = index; return acc; },{cur:-1,res:[]}); var missed = result.res; if(result.cur !== arr.length){ for(var i=result.cur+1;i 
 function findMissed(arr) { var result = arr.reduce(function(acc, el, index) { if (index - acc.cur > 1) { for (var i = acc.cur + 1; i < index; i++) { acc.res.push(i); } } acc.cur = index; return acc; }, { cur: -1, res: [] }); var missed = result.res; if (result.cur !== arr.length) { for (var i = result.cur + 1; i < arr.length; i++) { missed.push(i); } } return missed; } var a = [1, 2, 3, , 4, 5]; var missed = findMissed(a); printRes(a, missed); console.log(missed) a = [1, , 3, , 5, , 7, , 9] var missed = findMissed(a); console.log(missed) printRes(a, missed); a = [1, ,,,] var missed = findMissed(a); console.log(missed) printRes(a, missed); a = [,,,] var missed = findMissed(a); console.log(missed) printRes(a, missed); a = [,,,2] var missed = findMissed(a); console.log(missed) printRes(a, missed); function printRes(src, res) { document.getElementById('res').innerHTML += JSON.stringify(src) + '
' + JSON.stringify(res) + '
'; }
 

假设您知道有两个字符不在数据中(例如井号#和管道| ),您可以使用这个单行:

 Math.max(-1, [].concat(9, a, 9).join('#|#').split('|').indexOf('##')-1); 

9 s只是占位符,以防缺少的元素在开头或结尾。 (但请注意,在JavaScript中会忽略数组末尾的一个额外逗号,因此无法检查该条件。)

片段

 console.clear(); //hole at beginning: a= [,1,2,3,4,5]; console.log(Math.max(-1, [].concat(9, a, 9).join('#|#').split('|').indexOf('##')-1)); //0 //hole in middle: a= [1,2,3,,4,5]; console.log(Math.max(-1, [].concat(9, a, 9).join('#|#').split('|').indexOf('##')-1)); //3 //an extra comma at the end of an array is ignored in JavaScript: a= [1,2,3,4,5,]; console.log(Math.max(-1, [].concat(9, a, 9).join('#|#').split('|').indexOf('##')-1)); //-1 //only the last comma is ignored: a= [1,2,3,4,5,,]; console.log(Math.max(-1, [].concat(9, a, 9).join('#|#').split('|').indexOf('##')-1)); //5 

像这样创建一个数组a=[1,2,3,,4,5]; 将导致a[3] undefined而不为null

a.indexOf(undefined)a.indexOf('undefined')将无法正常工作。 将a[3]设置为null将不起作用,因为后面的所有内容都将向左移位

我建议您创建自己的数组方法,以搜索每个undefined值。

 var arr = [1,2,3,,4,5]; Array.prototype.findMissingValues = function(callback){ for(var i = 0; i < this.length; i++){ if(typeof this[i] === 'undefined'){ if(typeof callback != 'undefined'){ callback.apply(this, [i, this[i]]); } } } } arr.findMissingValues(function(index, value){ alert(value); });