如何使用indexOf方法检查数组内部是否存在'undefined'?

时间:2012-06-20 13:10:19

标签: javascript arrays

如果我有这样的数组

 A = ["1111", "22", "33", undefined, "55", undefined] ;

我通过删除一些元素获得了这个数组

我需要找到一个没有循环的数组中是否存在未定义的

A.indexOf('undefined') or A.indexOf(undefined)  .. wont work 

那么如何使用indexOf方法检查此数组中是否存在undefined?

2 个答案:

答案 0 :(得分:3)

重新评论以下内容:

  

我需要的是var A = [“1111”,“22”,“33”,undefined,“55”,undefined];在A中我需要通过splice methd删除所有未定义的数据并获取数组,如A = [“1111”,“22”,“33”,“55”]

这是与原作 完全 不同的问题。您可以使用新的ES5 Array#filterMDN)函数执行此操作,该函数在ES5之前的系统上是可调制的(搜索“ES5 shim”),如下所示:

A = A.filter(function(val) {
    return val !== undefined;
});

或使用for循环和Array#spliceMDN):

var index;
for (index = A.length - 1; index >= 0; --index) {
    if (A[index] === undefined) {
        A.splice(index, 1);
    }
}

indexOf问题的原始答案:

您已经说A.indexOf(undefined)不适合您。如果undefined中的A确实是您正在测试的undefined,则应该这样做。 (当然,除非你的数组中包含字符串A.indexOf('undefined'),否则"undefined"不会起作用。)

在正常情况下,这将输出3

var A = ["1111", "22", "33", undefined, "55", undefined] ;
console.log(A.indexOf(undefined));

你已经说过它没有,所以这里有一些原因可能没有,怎么办呢:

  1. 您希望indexOf为不存在的数组元素找到undefined值。例如,

    var A = ["1111", "22", "33", undefined, "55", undefined] ;
    console.log(A.indexOf(undefined)); // 3
    

    ......而是:

    var A = [];
    A.length = 6;
    A[0] = "1111";
    A[1] = "22";
    A[2] = "33";
    A[4] = "55";
    console.log(A.indexOf(undefined)); // -1
    

    原因是实际上具有值为undefined的元素的数组与没有该元素的数组之间存在差异。 JavaScript数组可能很稀疏,这意味着它们之间存在间隙。 (事实上​​,JavaScript数组根本就不是数组。)indexOf会跳过这些差距。

    如果您想查找undefined间隙,可以使用for循环:

    var i, index = -1;
    for (i = 0; i < A.length; ++i) {
        if (A[i] === undefined) {
            index = i;
            break;
        }
    }
    

    这是有效的,因为A[i]将因以下两个原因评估为undefined:A)元素存在且值为undefined,或者B)元素不存在完全没有。

  2. 你从另一个窗口得到了A。遗憾的是,一个undefined中的window不是===另一个窗口中的undefinedindexOf使用===。在这种情况下,您可以使用some代替(在具有ES5或使用ES5垫片的现代浏览器上):

    var A = /* ...get A from another window... */;
    var index = -1;
    A.some(function(val, i) {
        if (typeof val === "undefined") {
            index = i;
            return true;
        }
    });
    console.log(index); // 3
    

    或只是for循环:

    var i, index = -1;
    for (i = 0; i < A.length; ++i) {
        if (typeof A[i] === "undefined") {
            index = i;
            break;
        }
    }
    

    虽然一个窗口中的undefined在另一个窗口中没有=== undefined,但它们都有typeof "undefined",因此上述方法可以解决该问题。

  3. 你包括一个无意识地用Array#indexOf替换它自己的破碎版本的库。你可以通过这样做找出是否是这种情况:

    console.log(A.indexOf);
    

    你应该看到大致相同的东西:

    function indexOf() {
        [native code]
    }
    

    如果你看到了真正的源代码,那么有人会对它进行填充(如果浏览器已经拥有它,可能甚至不先检查它)。如果他们有,并且以这种方式破坏,则停止使用该库。 : - )

  4. 有些eejit在其中一个上下文中重新定义了undefined,例如:

    var A = ["1111", "22", "33", undefined, "55", undefined] ;
    (function(undefined) {
        console.log(A.indexOf(undefined)); // Outputs -1
    })("foo"));
    

    或者

    var A = (function(undefined) {
        return ["1111", "22", "33", undefined, "55", undefined] ;
    ])("foo");
    console.log(A.indexOf(undefined)); // Outputs -1
    

    如果他们已经这样做了,请追踪他们并鞭打他们。

答案 1 :(得分:0)

如果您尝试删除所有未定义的项目,我认为您可以通过这种方式快速完成:

var A = ["1111", "22", "33", undefined, "55", undefined];

var item = undefined; // value of the item to remove, it can be anything actually

while (A.indexOf(item) > -1) {
 dataArr.splice(A.indexOf(item), 1);
}

console.log(A); // output