var index = list.findIndex(item => item.name === "three")
list = list.setIn([index, "count"], 4)
説明
Immutable.jsコレクションを更新すると、常にそれらのコレクションの新しいバージョンが返され、元のコレクションは変更されません。そのため、JavaScriptのlist[2].count = 4
ミューテーション構文は使用できません。代わりに、Javaコレクションクラスの場合と同様に、メソッドを呼び出す必要があります。
簡単な例から始めましょう。リストのカウントだけです。
var arr = [];
arr.push(2);
arr.push(1);
arr.push(2);
arr.push(1);
var counts = Immutable.List.of(arr);
3番目のアイテムを更新したい場合、単純なJS配列は次のようになりますcounts[2] = 4
。ミューテーションを使用できず、メソッドを呼び出す必要があるため、代わりに以下を使用できます。-インデックスにcounts.set(2, 4)
値4
を設定することを意味します2
。
深い更新
あなたが与えた例にはネストされたデータがあります。set()
最初のコレクションだけでは使用できません。
Immutable.jsコレクションには、名前が「In」で終わるメソッドのファミリーがあり、ネストされたセットでより深い変更を行うことができます。最も一般的な更新メソッドには、関連する「In」メソッドがあります。たとえばset
ありますsetIn
。最初の引数としてインデックスまたはキーを受け入れる代わりに、これらの "In"メソッドは "キーパス"を受け入れます。キーパスは、更新する値に到達する方法を示すインデックスまたはキーの配列です。
あなたの例では、インデックス2のリストの項目を更新し、次にその項目内のキー「count」の値を更新したいとしました。したがって、キーパスはになります[2, "count"]
。setIn
メソッドの2番目のパラメーターはのようset
に機能します。これは、そこに配置する新しい値です。
list = list.setIn([2, "count"], 4)
正しいキーパスを見つける
さらに一歩進んで、名前が「3」で、3番目のアイテムだけではないアイテムを更新したいと実際に言った。たとえば、リストが並べ替えられていないか、「2」という名前のアイテムが以前に削除された可能性がありますか?つまり、最初に正しいキーパスを実際に知っていることを確認する必要があります。これには、findIndex()
メソッドを使用できます(ちなみに、これはArray#findIndexとほぼ同じように機能します)。
更新するアイテムを含むリストでインデックスを見つけたら、更新する値へのキーパスを指定できます。
var index = list.findIndex(item => item.name === "three")
list = list.setIn([index, "count"], 4)
注意:Set
vsUpdate
元の質問は、setメソッドではなくupdateメソッドについて言及しています。その関数の2番目の引数(と呼ばれるupdater
)について説明しますset()
。これはとは異なるためです。2番目の引数は、一方でset()
私たちが望む新しい値で、2番目の引数は、update()
ある機能以前の値を受け入れ、私たちが望む新しい値を返します。次に、updateIn()
の「イン」バリエーションがupdate()
キーパスを受け入れます。
たとえば、カウントを4
に設定するだけでなく、既存のカウントをインクリメントするバリエーションの例が必要だとすると、既存の値に1を追加する関数を提供できます。
var index = list.findIndex(item => item.name === "three")
list = list.updateIn([index, "count"], value => value + 1)