2017-05-04 6 views
5

Reactのthis.stateでは、以下のオブジェクトの動的配列を含むformErrorsというプロパティがあります。配列内のオブジェクトの1つを不変の方法で更新する

[ 
    {fieldName: 'title', valid: false}, 
    {fieldName: 'description', valid: true}, 
    {fieldName: 'cityId', valid: false}, 
    {fieldName: 'hostDescription', valid: false}, 
] 

のは、私はtrueの有効な値にフィールド名cityIdを持つ状態のオブジェクトを更新する必要があるとしましょう。

これを解決する最も簡単で最も一般的な方法は何ですか?

ライブラリimmutability-helperimmutable-jsなど、またはES6のいずれも使用できます。私は4時間以上これを試してグーグルで試しましたが、それでも私の頭を包み込むことはできません。いくつかの助けに非常に感謝しています。

+0

あなたは、配列を反復してみてください、そして場合ました'fieldName === 'cityId''それから' valid'を 'true'に設定しますか?これは非常に簡単なようです....私は何が欠けていますか?あなたが試したことのいくつかを投稿した場合に役立つかもしれません。 – alexanderbird

+0

私も@alexanderbirdと同じ考えをしていますので、具体的なパフォーマンス要件はありますか? –

+0

私の問題は[不変のデータ](https://facebook.github.io/react/docs/update.html)を扱うことです。 –

答えて

6

あなたはフィールド名がcityIdであれば、データを反復処理し、フィールド名を確認するためにmapを使用することができますが、あなたは値を変更する必要があり、新しいオブジェクトそうちょうどreturn同じobjectを返す

はこのようにそれを書く:

var data = [ 
    {fieldName: 'title', valid: false}, 
    {fieldName: 'description', valid: true}, 
    {fieldName: 'cityId', valid: false}, 
    {fieldName: 'hostDescription', valid: false}, 
] 

var newData = data.map(el => { 
        if(el.fieldName == 'cityId') 
        return Object.assign({}, el, {valid:true}) 
        return el 
       }); 

this.setState({ data: newData }); 
1

immutability-helper?非常にうまく動作します。あなたは$mergeコマンドを探しています。

@FellowStranger:私は、私のredux状態の1つのセクションしかオブジェクトの配列ではありません。私は、正しいエントリを更新するために減速してインデックスを使用します。

case EMIT_DATA_TYPE_SELECT_CHANGE: 
    return state.map((sigmap, index) => { 
    if (index !== action.payload.index) { 
     return sigmap; 
    } else { 
     return update(sigmap, {$merge: { 
     data_type: action.payload.value 
     }}) 
    } 
}) 

は率直に言って、これは一種の脂っこいある、と私は私の状態オブジェクトの一部を変更しようとするが、それは仕事をして...それはdoesnのあなたはレフィックスを使用しているような音ですが、戦術は似ているはずです。

+0

問題は私が試したことですが、オブジェクトの配列の値を置き換える方法を構文で理解できません:/ –

+0

ここの例をそのまま実行してください:https://github.com/kolodny/immutability-helper#nested-collections 。あなたは 'update(formErrors、{2:{valid:{$ set:true}}})' – Hamms

+1

や 'update(formErrors、{2: {$ merge:{valid:true}}}) ' – Hamms

1

代わりに、配列に値を格納するあなたは簡単に更新したいどの要素を指定することができますので、私は強く代わりにオブジェクトを使用することをお勧め。キー下の例ではフィールド名ですが、それは任意の一意の識別子を指定できます

var fields = { 
    title: { 
     valid: false 
    }, 
    description: { 
     valid: true 
    } 
} 

その後、あなたは不変ヘルパーのupdate機能を使用することができます。

var newFields = update(fields, {title: {valid: {$set: true}}}) 
関連する問題