如果我有这样的数组
A = ["1111", "22", "33", undefined, "55", undefined] ;
我通过删除一些元素获得了这个数组
我需要找到一个没有循环的数组中是否存在未定义的
A.indexOf('undefined') or A.indexOf(undefined) .. wont work
那么如何使用indexOf方法检查此数组中是否存在undefined?
答案 0 :(得分:3)
重新评论以下内容:
我需要的是var A = [“1111”,“22”,“33”,undefined,“55”,undefined];在A中我需要通过splice methd删除所有未定义的数据并获取数组,如A = [“1111”,“22”,“33”,“55”]
这是与原作 完全 不同的问题。您可以使用新的ES5 Array#filter
(MDN)函数执行此操作,该函数在ES5之前的系统上是可调制的(搜索“ES5 shim”),如下所示:
A = A.filter(function(val) {
return val !== undefined;
});
或使用for
循环和Array#splice
(MDN):
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));
你已经说过它没有,所以这里有一些原因可能没有,怎么办呢:
您希望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)元素不存在完全没有。
你从另一个窗口得到了A
。遗憾的是,一个undefined
中的window
不是===
另一个窗口中的undefined
,indexOf
使用===
。在这种情况下,您可以使用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"
,因此上述方法可以解决该问题。
你包括一个无意识地用Array#indexOf
替换它自己的破碎版本的库。你可以通过这样做找出是否是这种情况:
console.log(A.indexOf);
你应该看到大致相同的东西:
function indexOf() {
[native code]
}
如果你看到了真正的源代码,那么有人会对它进行填充(如果浏览器已经拥有它,可能甚至不先检查它)。如果他们有,并且以这种方式破坏,则停止使用该库。 : - )
有些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