2016-10-06 106 views
0

我是一个JavaScript初学者,所以如果这个问题太简单,请耐心等待。我试图简化此功能嵌套for循环和替代映射方法

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); 
}; 

有几件事情,我想在这里实现。计算应忽略nullNan值。我也想用mapreduce来实现这个计算。

+0

您的功能似乎在第一次看到确定。它按预期工作吗?什么console.log(totalSelectedUnit);原因呢?在特定情况下是否有错误? – Aschab

+0

如果你想忽略'x + = y'中的'null'或'NaN'值,你可以说'x + = y || 0'(注意[JavaScript的逻辑运算符](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Logical_Operators)的工作方式与大多数其他语言的工作方式不同)。在'for'循环之前,你还需要'totalSelectedUnit [i] = 0'。我不认为'.map()'在这里很有意义。 – nnnnnn

+0

关于你的错误,是否所有'nodeData.items'数组条目都有'usage'属性? – nnnnnn

回答

0

我可以看到的第一个问题是结果数组未被初始化,所以结果将为NaN,因为您正在为数字添加undefined值。

var calculateTotal = function(nodeData) { 
 
    var totalSelectedUnit = nodeData.items.map(function(item) { //create a result value for each item in the items array 
 
    return item.usage.categories.slice($scope.selectFrom, $scope.selectTo).reduce(function(v1, v2) { //sum up values between the from and to index 
 
     return v1 + (v2 || 0); //ignore the falsy values 
 
    }, 0); 
 
    }) 
 

 
    console.log(totalSelectedUnit); 
 
}; 
 

 
var $scope = { 
 
    selectFrom: 0, 
 
    selectTo: 4 
 
}; 
 

 
var nodeData = { 
 
    items: [{ 
 
    usage: { 
 
     categories: [2, 3, 4, 5, 6, 7, 8, 9, 1] 
 
    } 
 
    }, { 
 
    usage: { 
 
     categories: [12, 13, 14, 15, 16, 17, 18, 19, 10] 
 
    } 
 
    }, { 
 
    usage: { 
 
     categories: [22, 23, 24, 25, 26, 27, 28, 29, 20] 
 
    } 
 
    }] 
 
}; 
 

 
calculateTotal(nodeData);

+0

代码看起来不错,但是你错过了'current'部分吗?'categories [x] .current' –

+0

@anoopchandran你可以补充一点,创建一个具有该结构的虚拟数据有点困难,为什么我省略了 –

+0

你说得对,我通过初始化我的结果数组来解决这个问题。var totalSelectedUnit = []; for(i = 0; i