簡體   English   中英

Lodash。 通過鍵智能合並兩個對象

[英]Lodash. Smart merge two objects by keys

我有兩個對象。 A和B。

一種

{
   "beta" : {
     "value": null,
     "error" : null
   },
   "hamma" : {
     "value": null,
     "error" : null
   },
   "zerta" : {
     "value": null,
     "error" : null
   },
   "mozes" : 5
}

{
   "beta" : 5,
   "hamma" : 2
}

如何遍歷A鍵,將其與B對象進行比較並通過Lodash更新A對象中現有鍵的值? 也許存在一些不錯的方法? 我嘗試使用“ assing,assignWith”,但似乎我不了解它的工作原理。

結果應如下所示:

{
   "beta" : {
     "value": 5,
     "error" : null
   },
   "hamma" : {
     "value": 2,
     "error" : null
   },
   "zerta" : {
     "value": null,
     "error" : null
   },
   "mozes" : 5
}

感謝您提供任何信息。

我已經通過本機js解決了該解決方案,但是我想知道如何通過Lodash來實現。

export function mapServerModelToStateValues(state, serverModel) {
    let updatedState = {};
    const serverModelKeyList = Object.keys(serverModel);

    Object.keys(state).forEach(stateKey => {

        serverModelKeyList.forEach(modelKey => {
            if ( modelKey === stateKey ) {
                updatedState[ stateKey ] = {
                    ...state[ stateKey ],
                    value : serverModel[ modelKey ]
                }
            }
        });
    });

    console.log(updatedState);
}

您可以使用_.mergeWith lodash方法並傳遞自定義函數。

 var a = {"beta":{"value":null,"error":null},"hamma":{"value":null,"error":null},"zerta":{"value":null,"error":null},"mozes":5} var b = {"beta":5,"hamma":2, "mozes": 123} _.mergeWith(a, b, function(aValue, bValue) { _.isPlainObject(aValue) ? aValue.value = bValue : aValue = bValue return aValue }) console.log(a) 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script> 

這可以解決問題,請注意結果將使所有鍵的value, error相同value, error格式

 const A = { "beta": { "value": null, "error": null }, "hamma": { "value": null, "error": null }, "zerta": { "value": null, "error": null }, "mozes": 5 } const B = { "beta": 5, "hamma": 2 } const C = _.mapValues(A, (value, key) => { return { ...value, value: B[key] || value.value } }); console.log(C) 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script> 

這是一個遍歷B數組並使用set更新值的解決方案:

_.each(updates, (value, key) => _.set(data, `${key}.value`, value))

通過第二個對象的_keys映射,以相應地更新第一個對象:

 // obj a const a = { beta: { value: null, error: null }, hamma: { value: null, error: null }, zerta: { value: null, error: null }, mozes: 5 }; // obj b const b = { beta: 5, hamma: 2 }; // map through the 'obj b' keys and update 'obj a' accordingly _.keys(b).map(key => { a[key].value = b[key]; }); // log obj a to the console console.log(a); 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script> 

更新:我將使用@GruffBunny的解決方案-這個想法與此類似,但是使用lodash可以做得更好。

您可以使用lodash#mergelodash#mapValues實現此目的。

var result = _.merge({}, a, _.mapValues(b, value => ({ value })));

 var a = { "beta" : { "value": null, "error" : null }, "hamma" : { "value": null, "error" : null }, "zerta" : { "value": null, "error" : null }, "mozes" : 5 }; var b = { "beta" : 5, "hamma" : 2 }; var result = _.merge({}, a, _.mapValues(b, value => ({ value }))); console.log(result); 
 .as-console-wrapper { min-height: 100%; top: 0; } 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script> 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM