[英]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#merge
和lodash#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.