如何结合自定义时间戳属性使用Lodash的merge方法
如何用Lodash合并用户偏好对象并保留时间戳更大的属性
好问题!直接用Lodash的merge默认做不到,但用它的mergeWith方法完全可以实现这个需求——因为mergeWith允许你自定义属性的合并规则,正好用来比较timestamp并保留更新的那个值。
实现步骤
1. 补全示例数据
先把你给出的示例补全,方便测试:
const preferences1 = { 'favorite-color': { timestamp: 1, data: 'red' }, 'nickname': { timestamp: 1, data: 'dude' } }; const preferences2 = { 'favorite-color': { timestamp: 2, data: 'blue' }, 'nickname': { timestamp: 0, data: 'buddy' }, 'theme': { timestamp: 1, data: 'dark' } // 新增的属性 };
2. 用_.mergeWith实现自定义合并
编写自定义合并函数,当遇到包含timestamp的属性时,比较两个值的时间戳,保留数值更大的那个;对于其他情况(比如其中一个值不存在、或者不是带timestamp的对象),让Lodash按默认逻辑处理:
const _ = require('lodash'); const mergedPreferences = _.mergeWith({}, preferences1, preferences2, (a, b) => { // 如果两个值都是包含timestamp的对象,比较时间戳 if (_.isObject(a) && _.isObject(b) && 'timestamp' in a && 'timestamp' in b) { return b.timestamp > a.timestamp ? b : a; } // 返回undefined,让Lodash使用默认合并逻辑处理其他情况 }); console.log(mergedPreferences);
3. 输出结果
运行上面的代码,会得到:
{ 'favorite-color': { timestamp: 2, data: 'blue' }, // 保留了timestamp更大的blue 'nickname': { timestamp: 1, data: 'dude' }, // 保留了timestamp更大的dude 'theme': { timestamp: 1, data: 'dark' } // 新增的属性被保留 }
关键逻辑说明
- 合并函数的参数
a来自第一个源对象(preferences1),b来自第二个源对象(preferences2)。 - 我们先判断两个值是否都是带
timestamp的对象,是的话就比较时间戳,返回更新的那个。 - 如果返回
undefined,Lodash会自动用默认的merge逻辑处理(比如把新增的属性加到结果里,或者递归合并更深的对象)。
如果你的偏好对象有更深的嵌套结构,可以在合并函数里增加递归判断,但针对你给出的示例结构,上面的代码完全够用。
内容的提问来源于stack exchange,提问作者darkwing
相关产品推荐
相关产品推荐

