我是编程新手,只是想知道为什么输出newContainer与我在forloop中推送的内容不同。检查console.log以获取详细信息。
var data = [{
Fruit: "Apple",
Count: "1",
Date: "2014"
}, {
Fruit: "Banana",
Count: "1",
Date: "2015"
}, {
Fruit: "Carrot",
Count: "1",
Date: "2014"
}, {
Fruit: "Orange",
Count: "1",
Date: "2016"
}, {
Fruit: "Apple",
Count: "1",
Date: "2012"
}, {
Fruit: "Banana",
Count: "1",
Date: "2011"
}, {
Fruit: "Apple",
Count: "1",
Date: "2010"
}];
var lineItemCount = new Array(5).fill(0);
var lineItems = ["Apple", "Banana", "Carrot", "Orange"];
var newContainer = [];
for (var i = 0; i < data.length; i++) {
var checkItem = lineItems.indexOf(data[i].Fruit); //get index of item in lineItems
lineItemCount[checkItem] = lineItemCount[checkItem] + 1;
lineItemCount[0] = data[i].Date;
newContainer.push(lineItemCount);
console.log(lineItemCount);
};
console.log(newContainer);
我试图获得如下输出。谢谢!
["2014", 1, 0, 0, 0],
["2015", 1, 1, 0, 0],
["2014", 1, 1, 1, 0],
["2016", 1, 1, 1, 1],
["2012", 2, 1, 1, 1],
["2011", 2, 2, 1, 1],
["2010", 3, 1, 1, 1],
主要问题是您将相同的数组一遍又一遍地推到结果上。尽管在推送时,数组的值与下一次推送时的值不同,但数组是引用,因此,当数组中的值增加时,对该数组的任何引用都将看到此值,即使您已推送的那些引用也是如此。 。
这是更正后的代码,用于slice(0)
将数组元素复制到新数组中,然后将其推送:
// 5 elements, first one for date
var lineItemCount = new Array(5).fill(0);
var lineItems = [null, "Apple", "Banana", "Carrot", "Orange"];
var newContainer = [];
for (var i = 0; i < data.length; i++) {
var checkItem = lineItems.indexOf(data[i].Fruit); //get index of item in lineItems
lineItemCount[checkItem] = lineItemCount[checkItem] + 1;
lineItemCount[0] = data[i].Date;
newContainer.push(lineItemCount.slice(0)); // take array copy
console.log(lineItemCount);
};
console.log(newContainer);
还要注意数组中带有水果名称的其他项。这样可以确保您不会增加为日期保留的索引0处的元素。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句