2016-09-26 10 views
1

のセルを更新:ImmutableJS - 私はこの行列を持つ行列

const initialState = Immutable.fromJS({ 
    board: [ 
      ['','',''], 
      ['','',''], 
      ['','',''] 
     ] 
}); 

そして、この機能:(newBoardのOBJへ)

function cellClick(state,i,j) { 

const board = state.get('board'); 
var newBoard = board.map(function(arr) { 
    return arr.slice(); 
    }); 
newBoard.set(i,j,'Hi'); 
alert(newBoard.get(i).get(j)); 
} 
  1. クローン行列
  2. は設定してくださいマトリックスセルの値 - 動作しません。
  3. セル値を含むメッセージを出力しようとします。動作しません。

私はImmutableJSドキュメントを読み込もうとしましたが、マトリックス内に値を設定することについては何も見つかりませんでした( "List"タイプのImmutableJS)。

答えて

2

.setIn([i, j], 'Hi')を使用できますが、は値を変更しません。それがImmutableJSのポイントです。元のデータ構造のわずかに変更されたバージョンが返されます。行にsetInと書いて、結果をどこにも割り当てない場合、何も起こりません。何も変わりません。それがポイントです。

getInおよびsetInは非常に有用である。何かが存在しない場合、デフォルト値を提供することもできます。私はまた、.slice()が必要とは思わない。何も複製する必要はありません。

これは不変のデータ構造であり、誰もそれを変更することはできません。それは美しい部分です。

const initialState = Immutable.fromJS({ 
    board: [ 
      ['','',''], 
      ['','',''], 
      ['','',''] 
     ] 
}); 

const nextState = initialState.setIn(['board', 0, 0], 'Hi') 

// Now nextState has 'Hi' in it's first column and row. 
// initialState is still the same as it was, it is not changed. 
+0

実際に私は代わりにこれを行うことができますか? : board.setIn([i、j]、 'Hi'); alert(board.getIn([i、j])); – ohadinho

+1

いいえ、できません。あなたは 'setIn'呼び出しの結果をどこかに代入しなければなりません。不変であり、ボードを変更するのではなく、変更が適用された**新しい**ボードを返します。また、どこにでもログを記録したり警告したりするには、データ上で '.toJS()'を呼び出す必要があります。 – Olical

+1

ImmutableJSホームページのすべてを最初に読むことを強くお勧めします。https://facebook.github.io/immutable-js/ – Olical