最初の引数を変更する代わりに新しいオブジェクトを返すことを除いて、ほぼ同じように動作するlodash、underscore、またはその他のライブラリで使用可能な代替メソッドはありますか?.
var o = { 'user': 'barney' }
var result = method(o, { 'age': 40 }, { 'user': 'fred' })
// o still { 'user': 'barney' }
// result is now { 'user': 'fred', 'age': 40 }
これを行う最も一般的な方法は、次のように、空のオブジェクトを使用してそれに割り当てるようです。
var result = _.assign({}, l, m, n, o, p);
これは技術的に不変ではありませんが、関数が呼び出される前には存在しなかった「新しい」オブジェクトを生成します。
クローンの非常に巧妙な実装でさえ、これと同じことをしなければならないことを覚えておいてください。新しいオブジェクトを手動で作成するのは簡単なので、ほとんどのライブラリはこの場合のヘルパーについて心配する必要はありません。次に近いのは_.create
、これは正しいプロトタイプの割り当てと関係があります。
私は defaults() このような場合が好きです。
_var user = { user: 'barney', age: 36 };
_.defaults({ age: 40 }, user);
// → { user: 'barney', age: 40 }
user;
// → { user: 'barney', age: 36 }
_
最初の引数は宛先であり、user
は変更されません。ここでのage
の場合のように、プロパティをオーバーライドする必要がある場合はdefaults()
を使用するのが好きですが、元の関数では実際には何も変更したくありません。 defaults()
はundefined
に解決されるプロパティのみを追加するためです。 age
プロパティはオブジェクトリテラルに存在するため、その値は保持されます。
assign()
アプローチも同様に機能します--defaults()
はそれについて考える別の方法です。
Lodash assign
の関数型プログラミングバリアントは、引数を変更しません:)
これを試して:
import { assign } from 'lodash/fp';
// or:
// import _ from 'lodash/fp';
const a = {a: 1};
const b = {b: 1};
const c = assign(a, b);
// Results after assign operation:
// a: {a: 1}
// b: {b: 1}
// c: {a: 1, b: 1}
https://github.com/lodash/lodash/wiki/FP-Guide
ネストされたオブジェクトを再帰的にマージするには、merge
(FPバージョンのmerge
も不変))を使用します。
試してみてください immutable-js
var result = Immutable.Map(o).merge({ age: 40, user: 'fred' }).toObject();
console.log(result); // { user: 'fred', age: 40 }
console.log(o); // { user: 'barney' }