2016-10-06 45 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