KT.*_*KT. 4 javascript arrays undefined-index
我正在尝试遍历数组并删除并跳过元素,直到只有一个存在.我已经尝试过拼接,但是它弄乱了我的循环,因为来自arr [1]的元素变成了arr [0]等.
假设有10个人.我想删除1号人员然后保留2号人员然后移除3号人员并保留4号人员.此模式将一直持续到只剩下一人.
任何形式的帮助都可以.
ale*_*999 27
过滤虚假物品:
var a=[1,2,"b",0,{},"",NaN,3,undefined,null,5];
var b=a.filter(Boolean); // [1,2,"b",{},3,5]
Run Code Online (Sandbox Code Playgroud)
你不应该在迭代过程中更改集合,不仅仅是JavaScript,而是所有语言,定义一个新数组并在其中添加要删除的数组,并在以后迭代该数组以从第一个删除.
拼接时,只需减少循环索引.
有很多好的建议,我会发布不同选项的代码,你可以决定使用哪些
拼接时减少索引 http://jsfiddle.net/mendesjuan/aFvVh/
var undef;
var arr = [1,2, undef, 3, 4, undef];
for (var i=0; i < arr.length; i++) {
if ( arr[i] === undef ) {
arr.splice(i,1);
i--;
}
}
Run Code Online (Sandbox Code Playgroud)
向后循环 http://jsfiddle.net/mendesjuan/aFvVh/1/
var undef;
var arr = [1,2, undef, 3, 4, undef];
for (var i=arr.length - 1; i >=0; i--) {
if ( arr[i] === undef ) {
arr.splice(i,1);
}
}
Run Code Online (Sandbox Code Playgroud)
复制到新阵列 http://jsfiddle.net/mendesjuan/aFvVh/2/
var undef;
var arr = [1,2, undef, 3, 4, undef];
var temp = [];
for (var i=0; i < arr.length; i++) {
if ( arr[i] !== undef ) {
temp.push(arr[i])
}
}
arr = temp;
Run Code Online (Sandbox Code Playgroud)
使用过滤器只是一种创建新数组的奇特方式
var undef;
var arr = [1,2, undef, 3, 4, undef];
arr = arr.filter(function(item){
return item !== undef;
});
Run Code Online (Sandbox Code Playgroud)
在所有这些例子的最后,arr将是[1,2,3,4]
性能
IE 11,FF和Chrome同意这Array.splice是最快的.与Array.filter.将物品放入新阵列一样快10倍(Chrome),20倍(IE 11)也很慢Array.slice.请参见
http://jsperf.com/clean-undefined-values-from-array2
我很惊讶看到IE在这里领先,并看到Chrome背后的FF和IE.我不认为我曾经用这个结果进行过测试.