比方說,我們有一個像對象的數組:的Javascript:foreach()循環來填充陣列 - 關閉問題
var fruits = [ {name:"banana", weight:150},{name:"apple", weight:95},{name:"orange", weight:160},{name:"kiwi", weight:80} ];
我想填充從「水果」與項「heavy_fruits」陣的陣高於該重量爲> 100。這裏是我的代碼:
var heavy_fruits = [];
myfruit = {};
fruits.forEach(function(item,index) {
if (item.weight > 100) {
myfruit ["name"] = item.name;
myfruit ["weight"] = item.weight;
}
heavy_fruits.push(myfruit);
});
然而,它示出了: 名: 「橙」,重量:160 名: 「橙」,重量:160 名: 「橙」,體重:160 名稱:「橙」,重量:160
我知道這是混合閉包和循環的問題......但我讀了一篇文章(http://zsoltfabok.com/blog/2012/08/javascript-foreach/),解釋說我會避免使用forEach循環而不是經典循環來解決這類問題。
我知道我可以使用像filter()等數組方法,但我要求的目的,因爲我實際上有一個更大的功能,我不能暴露在這裏的麻煩......所以我試圖總結和簡化我的問題描述與「水果」。
'myfruit'指的是同一個對象。在'forEach'回調中移動'myfruit = {};'。我建議使用'filter'作爲'var heavy_fruits = fruits.filter(f => f.weight> 100);'。 – Tushar
這不是_closure_問題,它是關於引用相同的對象。 – Tushar
基本上你在做什麼是改變對象的屬性,因爲數組實際上是存儲對同一對象的引用,當你改變對象的屬性時,改變在每個引用中都是可見的。 –