私はfluxアプリケーションで immutable.js を使用しています。これは非常に便利で、パフォーマンスを向上させます。しかし、実際に私を悲しませているのは、それと一緒に lodash を使用できないという事実です。 Lodashはたくさんの便利な関数を備えた素晴らしいAPIを提供しているので、それらをまとめて私のために機能させる方法があるのではないかと思います。
私は最近、 mudash と呼ばれるImmutable.JSサポートを提供するLodashラッパーを作成しました。主要なLodash関数のほとんどがサポートされており、定期的に追加されています。
不変性と副作用のない関数が必要な場合は、 Ramda を使用できます。
ライブラリは、lodashに似ていますが、ユーザーデータを変更しない関数型プログラミングスタイルの便利な関数を提供します。
this React example ES6構文を使用してRamdaのflatten関数を使用することを検討してください。
import { flatten } from 'ramda';
const users = ['Steve Jobs', ['Steve Wozniak']];
const flatUsers = flatten(users);
// returns ['Steve Jobs', 'Steve Wozniak']
不変のセットでlodashマップを実行するようなことをしようとしていると思います。あなたがそれを直接行おうとすると、Lodashは役に立たないことをしません。
Immutable.jsには、独自の操作関数( map
など)と独自のレイジーチェーン(経由)がすでに多数あることに注意してください。 Seq
)なので、それらを調べる必要があります。
lodash
が提供し、_immutable.js
_が提供しないことを行う必要がある場合、実行できることの1つは、不変オブジェクトを取得して、lodashで使用できるようにVanillaJSオブジェクトに変換することです。例えば:
_// Do all of your fancy immutable.js stuff...
my_set = immutable.Set([1,2,3]).union(immutable.Set([2,3,4]))
// ...and then convert to JS before you do all of your fancy lodash stuff
mapped_set = _(my_set.toArray()).map(whatever)
_
もちろん、ここではパフォーマンスを考慮する必要があります。データをVanillaデータ構造にコピーして一方から他方に変換すると、両方の世界で最悪の結果になる可能性があるためです。たとえば、上記のおもちゃの場合は、immutable.js map()
を直接使用したほうがよいでしょう。
チェックアウトすることをお勧めします https://github.com/engineforce/ImmutableAssign 私が作成した、軽量で不変のヘルパーであり、不変性をサポートし、POJO(Plain Old JavaScriptオブジェクト)。したがって、任意のlodash関数を使用できます。
例えば。、
var iassign = require("immutable-assign");
var _ = require("lodash");
var o1 = { a: { c: 1 }, b: [1, 2, 3] };
var o2 = iassign(
o1,
function(o) { return o.b; }, // get property to be updated
function(b) { // update select property
return _.map(b, function(i) { return i + 1; });
}
);
// o2 = { a: { c: 1 }, b: [2, 3, 4] }
// o1 is not modified
// o2 !== o1
// o2.b !== o1.b
// o2.a === o1.a
ImmutableJSで withMutations を使用するのはどうですか?
検索する Batching Mutations
簡単な説明 ここ 。
seamless-immutable は、VanillaJSデータ構造と下位互換性のあるAPIを提供することを目的としています。
これにより、lodashメソッドを使用できます。ただし、lodashのメソッドの多くは可変性を念頭に置いて記述されているため、おそらく最適とはほど遠いものです。