web-dev-qa-db-ja.com

lodashアンダースコアまたは他のライブラリからの不変の_.assign(クローンで割り当てる)?

最初の引数を変更する代わりに新しいオブジェクトを返すことを除いて、ほぼ同じように動作する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 }
16
Chad

これを行う最も一般的な方法は、次のように、空のオブジェクトを使用してそれに割り当てるようです。

var result = _.assign({}, l, m, n, o, p);

これは技術的に不変ではありませんが、関数が呼び出される前には存在しなかった「新しい」オブジェクトを生成します。

クローンの非常に巧妙な実装でさえ、これと同じことをしなければならないことを覚えておいてください。新しいオブジェクトを手動で作成するのは簡単なので、ほとんどのライブラリはこの場合のヘルパーについて心配する必要はありません。次に近いのは_.create、これは正しいプロトタイプの割り当てと関係があります。

29
ssube

私は 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()はそれについて考える別の方法です。

5
Adam Boduch

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も不変))を使用します。

2
Mikael Lirbank

試してみてください 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' }
1
Travis Kaufman