2017-10-03 3 views
0

/テスト用にマージする良い方法:、我々はこれを現在は深い更新lodashとES6内のオブジェクトまたは深い更新する方法を探して他のライブラリ

をやっている:

{ 
    ..._companies, 
    ['c124']: { 
     ..._companies.c124, 
     ['fields']: { 
      ..._companies.c124.fields, 
      ['f4']: { 
       ..._companies.c124.fields.f4, 
       value: 'white' 
      } 
     } 
    } 

理想的に我々はこれを行うだろうというとき:それは完全にC124キーを置き換えるよう

update_merge(_companies, { 
    c124: { 
     fields: { 
      f4: { 
       value:'white' 
      } 
     } 
    } 
}) 

シンプル深いマージは、この場合には動作しません。

元_companiesはスニペット:

const companies = { 
    c123: { 
     id: 123, 
     name: 'Company one', 
     fields: {...} // fields     
    }, 
    c124: { 
     id: 124, 
     name: 'Company two', 
     fields: { 
      f1: {...}, //...fields     
      f2: {...}, //...fields     
      f3: {...}, //...fields     
      f4: { 
       id: 4, 
       fieldType: "shortText",longText 
       title: "favorite color", 
       value: 'green', // <==== only this will change 
      }, 
     }, 
    } 
} 

この期待される結果:我々はimmutability-helperを使用している私たちのプロジェクトで

const companies = { 
    c123: { 
     id: 123, 
     name: 'Company one', 
     fields: {...} // fields     
    }, 
    c124: { 
     id: 124, 
     name: 'Company two', 
     fields: { 
      f1: {...}, //...fields     
      f2: {...}, //...fields     
      f3: {...}, //...fields     
      f4: { 
       id: 4, 
       fieldType: "shortText",longText 
       title: "favorite color", 
       value: 'white', // <==== this changed 
      }, 
     }, 
    } 
} 
+0

元の「企業」オブジェクトを追加しますか? –

+0

...と予想される結果です。 –

+0

@OriDroriリクエストに応じて追加 – Guy

答えて

1

Lodashの_.merge()は再帰的である、とあなたは、ネストされたキー(ノートを更新することができます

lodash/fpから試すことができます - 私は青から値を変更していますが赤):

const companies = {"c123":{"id":123,"name":"Company one","fields":{}},"c124":{"id":124,"name":"Company two","fields":{"f1":{},"f2":{},"f3":{},"f4":{"id":4,"fieldType":"shortText","title":"favorite color","value":"blue"}}}}; 
 

 
const newCompanies = _.merge({}, companies, { 
 
    c124: { 
 
     fields: { 
 
      f4: { 
 
       value:'red' 
 
      } 
 
     } 
 
    } 
 
}) 
 

 
console.log(newCompanies);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

別のオプションを使用すると、オブジェクトを変異させることができるかどうlodashの_.set()を使用することです:

const companies = {"c123":{"id":123,"name":"Company one","fields":{}},"c124":{"id":124,"name":"Company two","fields":{"f1":{},"f2":{},"f3":{},"f4":{"id":4,"fieldType":"shortText","title":"favorite color","value":"blue"}}}}; 
 

 
_.set(companies, ['c124', 'fields', 'f4', 'value'], 'red') 
 

 
console.log(companies);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

しかし、あなたは多くの場合、それを行うと、例えばReduxので不変オブジェクトを(必要な場合は、 )、私はnormalizingより浅いよりアクセス可能な葉を持っていることを示唆しています。

1

を。これは、MongoDBのもののようなwrtiteクエリを可能にします。本当にチェックアウトする価値がある!

+0

素晴らしい!将来の読者のために、答えに答えを加えることができるかどうかについては、http://jsbin.com/zunehubuju/edit?jsを参照してください。私はあなたの答えをうれしく受け入れます。 – Guy

0

あなたはRamda assocPathまたはsetどちらも不変です

R.assocPath(['c124', 'fields', 'f4', 'value'], 'white', _companies); 
_.set(['c124', 'fields', 'f4', 'value'], 'white', _companies); 
_.set('c124.fields.f4.value', 'white', _companies); 
関連する問題