gpt4 book ai didi

Javascript 使用 lodash 或其他库递归地转换引用其他属性的对象

转载 作者:行者123 更新时间:2023-12-01 01:06:23 24 4
gpt4 key购买 nike

我想转换通过其属性相互引用的 JavaScript 对象,

说我有这个对象

{
apple: {
banana: [1,2,3],
cherry: [4,5,6],
},
banana: {
date: [7],
cherry: [8,9],
elderberry: [10, 11],
},
cherry: {
date: [7],
fig: [12,13],
},
date: {
fig: [11,14],
},
},

我想把那个对象变成这个

{
apple: {
banana: [1,2,3],
cherry: [4,5,6, 8,9],
date: [7],
elderberry: [10, 11],
fig: [11,14, 12,13],
},
banana: {
cherry: [8,9],
elderberry: [10, 11],
fig: [11,14, 12,13],
date: [7],
},
cherry: {
date: [7],
fig: [11,14, 12,13],
},
date: {
fig: [11,14],
},
}

在该示例中,苹果的樱桃属性有 [4,5,6, 8,9],[4,5,6]来自apple,[8, 9]来自banana,因为apple引用了banana,banana引用了cherry,所以会合并到[4,5,6, 8,9 ]

而且最终的数组实际上是唯一的值

所以想法是它将递归地合并其他组件值,使用lodash或其他库就可以了〜

最佳答案

我首先会创建一个存储相反关系的结构,即从子到父的关系。

然后,对于每个键/数组对,沿着路径(通过新结构)向上到达其祖先,并为每个键/数组对将数组添加到那里的同一个键。为此,我选择了使用显式堆栈变量的遍历,但它与递归 DFS 遍历一样有效。

最后再次访问所有数组以删除重复项。

function complete(data) {
// Create child-parent relationships:
const parents = {};
for (const parent in data) {
for (const child in data[parent]) {
(parents[child] = parents[child] || []).push(parent);
}
}
// Tree traveral to copy child array into same key in ancestors
const result = {};
for (const parent in data) {
for (const child in data[parent]) {
const arr = data[parent][child];
const visited = new Set;
const stack = [parent];
while (stack.length) {
const node = stack.pop();
if (visited.has(node)) continue;
visited.add(node);
((result[node] = result[node] || {})[child] = result[node][child] || []).push(...arr);
stack.push(...parents[node] || []);
}
}
}
// Remove duplicate values from the arrays
for (const parent in result) {
for (const child in result[parent]) {
result[parent][child] = [...new Set(result[parent][child])];
}
}
return result;
}

// Example call with data from the question:
const data = {apple: {banana: [1,2,3],cherry: [4,5,6],},banana: {date: [7],cherry: [8,9],elderberry: [10, 11],},cherry: {date: [7],fig: [12,13],},date: {fig: [11,14],},};
const result = complete(data);
console.log(result);

关于Javascript 使用 lodash 或其他库递归地转换引用其他属性的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55598382/

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