javascript - 在深度比较期间返回差异路径的递归函数
问题描述
我有以下递归函数:
const getDiff = (object, base) => {
const changes = (object, base, path = "") => {
return _.transform(object, function(result, value, key) {
if (!_.isEqual(value, base[key])) {
if (_.isObject(value) && _.isObject(base[key])) {
if (!path) {
path += `${key}`;
} else {
path += `.${key}`;
}
result[key] = changes(value, base[key], path);
} else {
if (!path) {
path = key;
}
result[key] = { value, path };
}
}
});
};
return changes(object, base);
};
我试图确保它不仅返回不同的属性,还返回该属性的直接路径。
例如,如果我有,
const objA = {
filter: {
tag: 1
},
name: 'a'
}
const objB = { name: 'b' };
然后得到差异应该产生:
{
filter: {
value: { tag: 1 },
path: 'filter.tag'
},
name: {
value: 'a',
path: 'name'
}
}
但现在它path: 'filter'
总是返回。我究竟做错了什么?
以下链接可快速访问控制台的 lodash:
fetch('https://cdn.jsdelivr.net/npm/lodash@4.17.4/lodash.min.js')
.then(response => response.text())
.then(text => eval(text))
解决方案
您当前的路径范围之外,_.transform
因此它将适用于所有分支。
将其范围限定在结果范围内_.transform
,一切正常。
例如:
const getDiff = (object, base) => {
//changed
const changes = (object, base, _path = "") => {
return _.transform(object, function(result, value, key) {
// changed
let path = _path;
if (!_.isEqual(value, base[key])) {
if (_.isObject(value) && _.isObject(base[key])) {
if (!path) {
path += `${key}`;
} else {
path += `.${key}`;
}
result[key] = changes(value, base[key], path);
} else {
if (!path) {
path = key;
} else { // changed
path += `.${key}`;
}
result[key] = { value, path };
}
}
});
};
return changes(object, base);
};
推荐阅读
- c++ - 为什么此代码会给出“程序中的“流浪 '\'”错误?
- sql - 根据输入月份检索结果的 SQL 查询
- php - PHP 没有收到来自 PostMan 的 json
- angular - Primeng p-table - 显示数据而不是 id
- angular - 如何在离子中实现搜索栏
- spring - spring integration:如何从 Spring Controller 调用 Spring Integration?
- javascript - 纯js在多语言的情况下计算字符输入
- jquery - 我们怎样才能让它无限滚动?
- python - 如何使列表中的项目永远运行 - python
- python - print和append方法中链表遍历的区别