Javascript: 迭代后数组未向右推或被覆盖
Javascript: Array not pushed right or overwritten after iteration
我正在通过 Angular-Chart 为购物清单应用程序创建统计视图。
它应该显示每个用户一年的所有支出成本的图表。
现在这就是我为图表生成 JSON 的方式:
$scope.data = {
series: users,
data: []
};
console.log(chartdata);
$scope.load = function(){
for(var i = 0; i< months.length; i++){
for(var z = 0; z < chartdata.length; z++){
var obj = chartdata[z];
if(obj.year == $scope.dt.getFullYear()){
if(obj.month == months[i]){
for(var t =0; t < users.length;t++){
if(obj.name == users[t]){
usercosts[t] = (usercosts[t] + obj.price);
console.log(obj.price);
console.log(usercosts);
}
}
}
}
}
console.log(usercosts);
$scope.data.data.push({x:months[i],y: usercosts});
for(var p = 0; p < users.length; p++){
usercosts[p]=0;
}
}
console.log($scope.data.data);
};
控制台中的输出如下所示:
[0, 0]
44
[44, 0]
[44, 0]
[0, 0]
[0, 0]
7
[7, 0]
[7, 0]
20
[20, 0]
[20, 0]
5
[5, 0]
[5, 0]
[0, 0]
[0, 0]
[0, 0]
[0, 0]
[0, 0]
数组填充正常,但推送语句:
$scope.data.data.push({x:months[i],y: usercosts});
就是不正常。
"usercosts" 在每一行中都是相同的值....最后一个;在这种情况下为 0。
尽管我在下个月经历之前就推动了。
我现在不知道该做什么了,希望能从您那里得到一些明智的答案。
最良好的祝愿
克里斯托夫
需要了解,当您将 usercosts
数组推入 chartData 数组时,它不是 usercosts
的副本,而是该数组的 reference
。
然后当您稍后设置时:
for(var p = 0; p < users.length; p++){
usercosts[p]=0;
}
您正在使用刚刚被推入另一个数组的同一个数组引用。
更改将反映在您有参考的任何地方。
非常简单的例子:
var a = [1];
var b = a; // looks like it would be a simple copy
alert( b[0] ); // alerts 1
// change value of b[0]
b[0] = 100;
alert( a[0]); // alerts 100 also because a and b are references to same array
我正在通过 Angular-Chart 为购物清单应用程序创建统计视图。 它应该显示每个用户一年的所有支出成本的图表。 现在这就是我为图表生成 JSON 的方式:
$scope.data = {
series: users,
data: []
};
console.log(chartdata);
$scope.load = function(){
for(var i = 0; i< months.length; i++){
for(var z = 0; z < chartdata.length; z++){
var obj = chartdata[z];
if(obj.year == $scope.dt.getFullYear()){
if(obj.month == months[i]){
for(var t =0; t < users.length;t++){
if(obj.name == users[t]){
usercosts[t] = (usercosts[t] + obj.price);
console.log(obj.price);
console.log(usercosts);
}
}
}
}
}
console.log(usercosts);
$scope.data.data.push({x:months[i],y: usercosts});
for(var p = 0; p < users.length; p++){
usercosts[p]=0;
}
}
console.log($scope.data.data);
};
控制台中的输出如下所示:
[0, 0]
44
[44, 0]
[44, 0]
[0, 0]
[0, 0]
7
[7, 0]
[7, 0]
20
[20, 0]
[20, 0]
5
[5, 0]
[5, 0]
[0, 0]
[0, 0]
[0, 0]
[0, 0]
[0, 0]
数组填充正常,但推送语句:
$scope.data.data.push({x:months[i],y: usercosts});
就是不正常。 "usercosts" 在每一行中都是相同的值....最后一个;在这种情况下为 0。 尽管我在下个月经历之前就推动了。 我现在不知道该做什么了,希望能从您那里得到一些明智的答案。 最良好的祝愿 克里斯托夫
需要了解,当您将 usercosts
数组推入 chartData 数组时,它不是 usercosts
的副本,而是该数组的 reference
。
然后当您稍后设置时:
for(var p = 0; p < users.length; p++){
usercosts[p]=0;
}
您正在使用刚刚被推入另一个数组的同一个数组引用。
更改将反映在您有参考的任何地方。
非常简单的例子:
var a = [1];
var b = a; // looks like it would be a simple copy
alert( b[0] ); // alerts 1
// change value of b[0]
b[0] = 100;
alert( a[0]); // alerts 100 also because a and b are references to same array