2016-10-06 7 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); 
}; 

を試みた方法です。計算では、nullまたはNanの値を無視する必要があります。また、この計算を達成するためにmapreduceを使用したいと思います。

+0

あなたの関数は、最初の一瞥でOKらしいです。それは期待どおりに働いていますか?どのようなconsole.log(totalSelectedUnit);与えるか?特定の状況下でエラーがありますか? – Aschab

+0

'x + = y'の' null'や 'NaN'の値を無視したい場合は' x + = y || (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

私が見ることができる最初の問題は結果の配列が初期化されていないため、数字にundefinedの値を追加すると結果はNaNになります。

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

関連する問題