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

时间:2015-06-01 12:58:29

标签: javascript jquery arrays

我有一个类似

的数组
a=[1,2,3,,4,5];

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

8 个答案:

答案 0 :(得分:6)

检查值是否为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/

答案 1 :(得分:2)

不幸的是,ES5 Array方法需要*来跳过这样的数组漏洞**,所以没有indexOf()forEach()会有所帮助。 ECMAScript 2015有两个名为find()findIndex()的新方法可以帮助你,但它们不是widely supported yet,所以我认为这个问题不是一个好的答案。< / p>

剩下的是对索引的旧迭代:

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()步骤9和map() a[3]需要跳过漏洞的算法

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

你可以试试这个

&#13;
&#13;
                  a=['1','2','3',,'4']
            
            for(var i=0;i<a.length;i++)
              {
               if( a.indexOf(a[i])==-1)
                 // if(typeof a[i] == 'undefined')
                    alert("Index-->"+i)
              }
&#13;
&#13;
&#13;

答案 5 :(得分:0)

使用reduce函数的另一种方法,获取所有遗漏的值。

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

&#13;
&#13;
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) + '<br/>' + JSON.stringify(res) + '<br/>';
}
&#13;
<div id="res"></div>
&#13;
&#13;
&#13;

答案 6 :(得分:0)

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

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

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

<强>段

&#13;
&#13;
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
&#13;
&#13;
&#13;

答案 7 :(得分:-1)

创建类似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);
});