gpt4 book ai didi

javascript - 如何使用 lodash 有选择地合并/更新/忽略两个对象?

转载 作者:行者123 更新时间:2023-12-04 07:15:32 31 4
gpt4 key购买 nike

我们有两个结构相同的对象,我们希望根据元素名称有选择地组合值。一些我们想要接受更新值并覆盖,另一些我们想要忽略更新,以及一些我们想要组合为联合的数组元素。
例如,对于这两个对象..

var server = {
'title': 'string',
'systems': [3,4,5],
'views': 1000,
'authors': ['fred','bill']
};

var update = {
'title': 'new string',
'systems': [5],
'views': 900,
'authors': ['fred','jim']
};
我们要更换 title , 替换 systems , 忽略 views , 和工会 authors .. 生产这个对象:
var result = {
'title': 'new string', // value repaced
'systems': [5], // array wholly replaced
'views': 1000, // update value ignored
'authors': ['fred','bill','jim'] // update unioned with server
};
我们都试过了 _.merge_.assign但它们给出了错误的结果(例如 systems 变成了 [5,4,5] )并且都没有提供忽略特定更新元素的选项(例如 View )
将来可能会添加更多元素(代码中的其他地方),因此我们不想自定义代码组合,而是依赖默认 _.assign -like 或 _.merge - 未知元素的类似行为。
有没有可以处理这个的 lodash 函数?

最佳答案

我不知道是否可以使用 lodash,但这里有一个简单的 javascript 函数可以帮助你做到这一点:

const server = {
'title': 'string',
'systems': [3,4,5],
'views': 1000,
'authors': ['fred','bill']
};

const update = {
'title': 'new string',
'systems': [5],
'views': 900,
'authors': ['fred','jim']
};

const merge = (source, update, actions) => Object.keys(source).reduce((result, k) => {
if (actions.replace.includes(k)) {
result[k] = update[k];
} else if (actions.ignore.includes(k)) {
result[k] = source[k];
} else if (actions.union.includes(k)) {
result[k] = [...new Set([...source[k], ...update[k]])];
}
return result;
}, {});

console.log(merge(server, update, {replace: ['title', 'systems'], ignore: ['views'], union: ['authors']}));

哪里 actions是一个类型的对象:
{replace: [<properties to replace>], ignore: [<properties to ignore>], union: [<properties to union>]}

关于javascript - 如何使用 lodash 有选择地合并/更新/忽略两个对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68795889/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com