2017-01-04 8 views
1

誰かが私がここで間違っていることを私に見せることができたら、私は_.reduceを使ってオブジェクトのフィールドを取得しようとしていて、毎回「最初のもの」が欠けているようです。Lodash _.reduce issue?

ここの最初の行は普通のjsで、次はlodashです。 $のscope.itemが

$scope.item = { 
field1: 'test', 
field2: 'test', 
field3: 'test', 
field4: 'test', 
field5: 'test', 
field6: 'test' 
}; 

https://plnkr.co/edit/J9MBahQNIsZkMFzrHjKG

答えて

0

利用_.forEach()の代わりに、_.reduce()plunk)である

$scope.actualKeys = Object.keys($scope.item); 
_.reduce($scope.item, function(result, value, key) { 
    $scope.keys.push(key); 
}); 

_.forEach($scope.item, function(value, key) { 
    $scope.keys.push(key); 
}); 
1

それは最初の要素が欠けていた場合、私は」危険なことは、最初のアキュムレータを設定していない場合、最初のアキュムレータを最初のアキュムレータとして使用してから、2番目の要素のフォールドを開始します。

注:私はロダシを知らない。これは単に標準的な動作を減らすことです。その文書を見て、最初のアキュムレータを設定する方法を見てください。

リストが空にならないことがわかっていない限り、初期アキュムレータを設定するのが一般的です。それを設定しないと、空のリストを減らそうとすると、スローされるか、undefined(lodashの振る舞いによる)が返されます。これらの失敗を考慮することなく、あなたは驚きを得るかもしれません。

0

アキュムレータを追加しても機能します。

$scope.actualKeys = Object.keys($scope.item); 
_.reduce($scope.item, function(result, value, key) { 
    $scope.keys.push(key); 
}, 0); 
0

reduce関数を使用して、コレクションを1つの値に減らします。それを通るたびに、前の値に基づいて蓄積されるので、最初の値に問題があります。言い換えれば、あなたがそれを働かせることができる間に(他の人が示しているように)、それは仕事のための間違ったツールです。

この場合に必要なものは、単純なループです(またはすでにご存じのように、Object.keys)。