-1

如果我有这样的数组

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

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

我需要在不循环的情况下查找数组中是否存在未定义

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

那么如何使用 indexOf 方法检查该数组中是否存在未定义?

4

2 回答 2

3

在下面回复您的评论:

我需要的是 var A = ["1111", "22", "33", undefined, "55", undefined] ; 在 A 中,我需要通过拼接方法删除所有未定义并获得像 A = ["1111", "22", "33","55"] 这样的数组

这与您的原始问题完全不同。您可以使用新的 ES5 Array#filter( MDN ) 功能来做到这一点,该功能在 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)对你不起作用。它应该,只要undefinedinA真的是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)元素存在并且它具有 value undefined,或 B)元素根本不存在。

  2. 你已经A从另一个窗口得到了。可悲的是,in undefinedonewindow不是in another window,而是使用. 在这种情况下,您可以改用(在具有 ES5 的现代浏览器上,或使用 ES5 shim):===undefinedindexOf===some

    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
    

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

于 2012-06-20T13:24:04.153 回答
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
于 2012-08-09T21:01:50.583 回答