{ r-6ren">
gpt4 book ai didi

javascript - 递归函数在深度比较期间返回差异的路径

转载 作者:行者123 更新时间:2023-12-02 21:45:02 24 4
gpt4 key购买 nike

我有以下递归函数:

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);
};

关于javascript - 递归函数在深度比较期间返回差异的路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60275666/

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