lodash深度递归两个对象,并返回新对象
时间: 2023-08-04 18:19:02 浏览: 91
如果您想递归比较两个lodash对象,并返回一个包含两个对象中所有不同属性的新对象,可以使用`_.cloneDeep()`方法和递归方法。
下面是一个示例代码:
```
const _ = require('lodash');
const obj1 = {
name: 'John',
age: 25,
address: {
city: 'New York',
street: '123 Main St'
},
hobbies: ['music', 'sports']
};
const obj2 = {
name: 'John',
age: 30,
address: {
city: 'Los Angeles',
street: '456 Oak St'
},
hobbies: ['music', 'reading']
};
const diffObj = (obj1, obj2) => {
const result = {};
const keys = _.union(_.keys(obj1), _.keys(obj2));
_.each(keys, (key) => {
const val1 = obj1[key];
const val2 = obj2[key];
if (!_.isEqual(val1, val2)) {
if (_.isObject(val1) && _.isObject(val2)) {
result[key] = diffObj(val1, val2);
} else {
result[key] = [val1, val2];
}
}
});
return result;
};
console.log(diffObj(obj1, obj2));
```
在上面的代码中,`_.union()`方法用于获取两个对象的所有属性名,`_.each()`方法逐个比较两个对象中的属性值,如果属性值不相等,则将属性名及其对应的值添加到结果对象中。
如果属性值是对象类型,则递归调用`diffObj()`方法。如果属性值不是对象类型,则将其作为数组添加到结果对象中。
需要注意的是,如果两个对象中存在循环引用,则递归方法可能会导致栈溢出错误。如果您需要处理循环引用的情况,请使用其他工具库或自行编写处理递归的代码。
阅读全文