この答えは、ほとんどの問題は、アキュムレータオブジェクトの突然変異である@iofjuupasli
によってコメントに拡張します。あなたはfoo
の定義で1つを作成し、それはすべての呼び出しで再利用され、iteratee
(恐ろしい名前、IMHO。bar
または何か:-)と呼んでください)で更新します。これを解決するにはいくつかの方法があります。一つは、あなたがfoo
に各呼び出しに新しいアキュムレータを渡すことを確認するために、次のようになります。
var iteratee = (acc, [k, v]) => {
acc[k] = ++v;
return acc
}
var foo = R.pipe(
R.toPairs,
list => R.reduce(iteratee, {}, list)
)
foo({ a: 1, b: 2}); //=> {"a": 2, "b": 3}
foo({ c: 3, d: 4}); //=> {"c": 4, "d": 5}
これは動作しますが、満足のいかない感じ。おそらく、各パスでアキュムレータオブジェクトを変更するのを避けるほうが、もっと役立つでしょう。これは、クリーンなようだ
var iteratee = (acc, [k, v]) => R.assoc(k, v + 1, acc)
var foo = R.pipe(
R.toPairs,
R.reduce(iteratee, {})
);
foo({ a: 1, b: 2}); //=> {"a": 2, "b": 3}
foo({ c: 3, d: 4}); //=> {"c": 4, "d": 5}
:assoc
は、可能な限り、以前の1のできるだけ多くを再利用し、新しいオブジェクトを作成します。しかし実際、Ramdaははるかに単純なソリューションを持っています。 map
関数は、オブジェクトをマッピングするファンクタとして扱います。
var foo = R.map(R.inc);
foo({ a: 1, b: 2}); //=> {"a": 2, "b": 3}
foo({ c: 3, d: 4}); //=> {"c": 4, "d": 5}
をそして、それは本当にきれいな感じ:単純に値をインクリメントしinc
、でこれを組み合わせることで、私たちはこれを行うことができます!
初期値を変更します。 Ramdaはそれを気にせず、反復の開始時にクローンを作成しません – iofjuupasli
また、マップ関数を使ってあなたの例を行うことができます – iofjuupasli