【发布时间】:2016-10-06 03:05:41
【问题描述】:
我是 javascript 的初学者,如果这个问题太简单,请多多包涵。我正在尝试简化此功能
var calculateTotal =function(nodeData){
var totalSelectedUnit0 = 0;
var totalSelectedUnit1 = 0;
var totalSelectedUnit2 = 0;
for(x=$scope.selectFrom; x<$scope.selectTo; x++){
totalSelectedUnit0 += nodeData.items[0].usage.categories[x].current;
totalSelectedUnit1 += nodeData.items[1].usage.categories[x].current;
totalSelectedUnit2 += nodeData.items[2].usage.categories[x].current;
}
console.log(totalSelectedUnit0);
console.log(totalSelectedUnit1);
console.log(totalSelectedUnit2);
};
calculateTotal(node);
这就是我尝试重构代码的方式
var calculateTotal =function(nodeData){
var totalSelectedUnit=[];
for(i=0; i<nodeData.items.length; i++){
for(x=$scope.selectFrom; x<$scope.selectTo; x++){
totalSelectedUnit[i] += nodeData.items[i].usage.categories[x].current;
}
}
console.log(totalSelectedUnit);
};
我想在这里实现几件事。计算应忽略 null 或 Nan 值。另外我想使用map 和reduce 来实现这个计算。
【问题讨论】:
-
您的功能乍一看似乎没问题。它是否按预期工作?什么 console.log(totalSelectedUnit);给?在特定情况下是否有错误?
-
如果你想忽略
x += y中的null或NaN值,你可以说x += y || 0(注意JavaScript's logical operators 的工作方式与大多数其他语言不同)。在内部for循环之前,您还需要totalSelectedUnit[i] = 0。我认为.map()在这里没有多大意义。 -
关于您的错误,是否所有
nodeData.items数组条目都有usage属性? -
抱歉,代码出现了小错误。现在它输出的是
-,只是一个连字符,假设我们有些项目没有使用属性,我们如何跳过这些并计算剩余? -
在
for语句中声明变量时要非常小心。例如:for(i=0;...在名为i的窗口对象上创建一个全局变量。这会在未来给你带来痛苦。声明变量时始终使用var关键字。
标签: javascript arrays object ecmascript-6