javascript forEach循环可能会产生奇怪的输出

问题描述:

这个输出是如何产生任何意义的?也许我的想法是错误的,但它似乎相当描述什么它应该是洞javascript forEach循环可能会产生奇怪的输出

var dataset = [1, 2, 3]; 

dataset.forEach(function(element, index, array) { 
    //   (index, how many to remove) 
    array.splice(0, 0); 
}); 

returns [1,2,3] as expected 

dataset.forEach(function(element, index, array) { 
    array.splice(0, 3); 
}); 

returns [] as expected 

dataset.forEach(function(element, index, array) { 
    array.splice(0, 1); 
}); 

returns [3] 

dataset.forEach(function(element, index, array) { 
    array.splice(0, 2); 
}); 

returns [3] 

这让我质疑我理解一切大声笑。我有一个更复杂的需求,其中对象的数组可以有属性“element.archived”

var dataset = [Object, Object, Object] 

dataset.forEach(function(element, index, array) { 
    if (element.archived) array.splice(index, 1); 
}); 

我想迭代这个数组,并删除有真正的这个属性值的所有对象。

+3

methinks你只是使用错误的仪器进行过滤。看起来你需要简单的[array.filter](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/filter) – Grundy

+1

你为什么要在'array.splice'里面* 'forEach'?你真的*需要在阵列上运行'splice' 3次吗? –

+1

@RocketHazmat,_完全是我的问题。 OP似乎对[splice'工作方式]有一个误解(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice)。 – Andy

所以你想从archived: true的数组中删除对象。这里有几个方法可以做到这一点:

您可以使用filter返回一个过滤数组:

var arr = dataset.filter(function (el) { 
    return el.archived !== true; 
}); 

或者您可以使用splice删除元素,你在它们之间迭代:

for (var i = dataset.length - 1; i >= 0; i--) { 
    if (dataset[i].archived === true) dataset.splice(i, 1); 
} 

DEMO

+0

似乎与_splice_错误样本 - 当我们删除项目,我们不应该增加'我'变量 – Grundy

+1

我的意思是这样的:http://jsfiddle.net/Lz1odsms/1/ – Grundy

+0

Doh。感谢您的提升。 – Andy