2017-05-11 5 views
0

私はReduxを使用してRPGキャラクタジェネレータを作成しています。私の減速機では、ギアを変更してこれらの変更を追跡できるようにしたいと考えています。変更には格付けを付けることができますが、必ずしも格付けを持つ必要はありません。キーの値が未定義の場合、オブジェクトリテラル表記でキーを設定しない方法

評価が未定義の場合は、記録しないことをおすすめします。値が未定義の場合、オブジェクトのリテラル表記法でキーを追加しない方法がありますか?

gearNameは変更するギアの文字列です。

modは、+ rating fire resistanceなどのmodに関するプロパティを含むオブジェクトです。

評価は、変更の価値を表す数値です。

const purchaseGear = (state, action) => { 
    const { gearName, mod, rating } = action.parameter; 

    switch (action.type) { 
    case MOD_GEAR: 
     return { 
     ...state, 
     [gearName]: { 
      ...state[gearName], 
      mods: { 
      ...state[gearName].mods, 
      [mod.name]: { 
       ...mod, 
       rating 
      } 
      }, 
      cost: mod.cost * (rating || 1) 
     } 
    } 
} 
+0

私は[* Object initilazer *](http://ecma-international.org/ecma-262/7.0/index.html#sec-object-initializer)の仕様でこれを行う方法はありません。 : "*中かっこで囲まれた0個以上のプロパティキーと関連する値のリストです。 – RobG

+0

これの全体的な目標は何ですか?一般に、パフォーマンスのためにオブジェクトを一貫した形状に保つ方が良いです。値に基づいてキーが存在するかどうかを変更すると、コードが遅くなる可能性があります。 – loganfsmyth

+3

'Object.assign'がnull/false /未定義引数を無視するという事実を利用して、' Object.assign'で動作するトリックは 'Object.assign({}、rating && {rating})'です。 –

答えて

1

Axel Rauschmayer on 2ality.com次のパターンを提案:だからあなたの場合には、それは

...(rating !== undefined ? {rating: rating} : {}) 

ようなものになるだろう

const cond = false; 
const obj = { 
    ...(cond ? {a: 1} : {}), 
    b: 2, 
}; 
    // {b: 2} 

をエンジンがすでにサポートしている場合、このパターンにのみ動作することに注意してくださいObject rest/spread-proposal。 Chrome v58でも動作しますが、他のプラットフォームではテストしていません。

+0

を使用してルートレデューサーに結合することができます。それは魅力的に機能します。ありがとうございました。そしてその素晴らしくもエレガントです。 – dethstrobe

関連する問題