您好我正在使用javascript / node.js。我有两个数据对象。 (请注意,真实对象比这复杂得多。)
const original = {
'totAmount': 10,
'testVal': 'zzzzzzzz',
'potentialPaid': 10,
'depositAmount': 10,
'payment': {
'amount': 10,
'testVal': 'zzzzzzzz',
'details': {
'amount': 10,
'testVal': 'zzzzzzzz',
'statusHistory': {
'amount': 10,
'testVal': 'zzzzzzzz'
}
}
},
'coupon': {'test': 1000}
};
和
const dataToUpdate = {
'totAmount': 65,
'potentialPaid': 65,
'depositAmount': 65,
'payment': {
'amount': 65,
'details': {
'amount': 65,
'statusHistory': {
'amount': 65
}
}
},
'coupon': {}
};
我希望使用相同的密钥替换original
中的dataToUpdate
中的所有值。
我的预期结果是
const original = {
'totAmount': 65,
'testVal': 'zzzzzzzz',
'potentialPaid': 65,
'depositAmount': 65,
'payment': {
'amount': 65,
'testVal': 'zzzzzzzz',
'details': {
'amount': 65,
'testVal': 'zzzzzzzz',
'statusHistory': {
'amount': 65,
'testVal': 'zzzzzzzzz
}
}
},
'coupon': {}
};
我在Object.assign()
和其他许多人看过.merge
lodash
等各种解决方案。
我现在已经坚持了3个多小时,但仍然无法找到任何解决方案。
有没有可用的默认javascript函数做这种事情? , 请帮忙。
提前致谢。
答案 0 :(得分:2)
经过一些研究后,我发现版本4.0.0 lodash有一个mergeWith函数,可以让你为合并应用自定义条件。
我在这里添加了一个适用于您的示例的jsfiddle,但可能需要稍微调整以涵盖其他一些场景(我不确定)。
jsfiddle中允许您自定义合并标准的函数是:
function customizer(objValue, srcValue) {
if (_.isEmpty(srcValue)) {
return srcValue;
}
else {
_.merge(objValue, srcValue);
}
}
这是jsfiddle:
我希望这会有所帮助。
答案 1 :(得分:1)
Lodash的_.mergeWith()
是开箱即用的递归。 _.mergeWith()
接受自定义程序功能。如果自定义程序返回undefined
,则_.mergeWith()
会使用默认的合并规则。
const original = {"totAmount":10,"testVal":"zzzzzzzz","potentialPaid":10,"depositAmount":10,"payment":{"amount":10,"testVal":"zzzzzzzz","details":{"amount":10,"testVal":"zzzzzzzz","statusHistory":{"amount":10,"testVal":"zzzzzzzz"}}},"coupon":{"test":1000}};
const dataToUpdate = {"totAmount":65,"potentialPaid":65,"depositAmount":65,"payment":{"amount":65,"details":{"amount":65,"statusHistory":{"amount":65}}},"coupon":{}};
const result = _.mergeWith(original, dataToUpdate, (objValue, srcValue) => _.isEmpty(srcValue) ? srcValue : undefined);
console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>
答案 2 :(得分:0)
我做了一个自定义函数来替换对象中的嵌套属性,包括数组和对象
const a = {
name: 'John Doe',
email: 'john@mail.com',
location: {
country: {
name: 'Japan',
abbr: 'JP',
},
place: 'Tokyo',
},
phone: [123, 456],
};
const b = {
email: 'johndoe@mail.com',
location: {
country: {
name: 'Canada',
abbr: 'CA',
},
},
phone: [123],
};
const superReplace = (object, value) => {
let replace = {};
Object.keys(object).forEach((prop) => {
if (value[prop] !== undefined) {
if (Array.isArray(object[prop])) replace[prop] = value[prop];
else if (typeof object[prop] === 'object') {
replace[prop] = superReplace(object[prop], value[prop]);
} else replace[prop] = value[prop];
} else replace[prop] = object[prop];
});
return replace;
};
console.log(superReplace(a, b));
// {
// name: 'John Doe',
// email: 'johndoe@mail.com',
// location: { country: { name: 'Canada', abbr: 'CA' }, place: 'Tokyo' },
// phone: [ 123 ]
// }