2015-12-02 95 views
0

這個輸出是如何產生任何意義的?也許我的想法是錯誤的,但它似乎相當描述什麼它應該是洞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

回答

2

所以你想從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