2017-06-14 10 views
0

私はそうのような機能を削減ImmutableJS年代を使用しようとしている:ImmutableJSの不変アキュムレータでのreduce関数の使用方法は?

const myChanges = data 
    .getIn(['a', 'b']) // Immutable.List 
    .reduce((accum, data) => { 
    // console.log('accum', accum); 
    // console.log('data', data); <--- an Immutable.Map 
    accum.push(List([ data.get('id'), data.get('time') ])); 
    return accum; 
    }, List()); 

しかし、accumは常に空Immutable.Listとしてログを慰めます。私の推測ではList()は変更できないため、accumが新しい空のImmutable.List()を返すたびに変わる可能性があります。

私が得たいと思っているのは、内部リスト(本質的にタプル)のそれぞれがidtimeからなるリストのリストです。

これを動作させるにはどうすればよいですか? withMutationsを使用する必要がありますか?

答えて

1

すべてのデータは、あなたがそれを変更して新しいオブジェクトを返しますデpushメソッドを呼び出すとき、「読み取り専用」であり。このコードの場合 あなたが直接返す必要動作します:

const myChanges = data.getIn(['a', 'b']) 
    .reduce((accum, data) => { 
     return accum.push(List([ data.get('id'), data.get('time') ])); 
    }, List()); 

たり、変数に結果を格納し、それを

const myChanges = data.getIn(['a', 'b']) 
    .reduce((accum, data) => { 
     let result = accum.push(List([ data.get('id'), data.get('time') ])); 
     return result; 
    }, List()); 
を返すことができます。
0

お客様の問題は、元のaccumを返し、データを含む新しい値ではありません。変更可能なJS Arrayとは異なり、pushは新しいリストを返します。不変で

const myChanges = data 
    .getIn(['a', 'b']) 
    .reduce((accum, d) => { 
    return accum.push(List([ d.get('id'), d.get('time') ])); 
    }, List()); 
関連する問題