我正在嘗試將 Tree2 合并到 Tree1 中。合并后的結果包含 Tree1 中的所有現有節點以及 Tree2 節點,這些節點位于層次結構中的正確級別,但 Tree1 中不存在這些節點。最終的樹輸入更大更深,但我一直在努力使用下面的簡單示例樹。
Tree1 = {"name":"A","children":[{"name":"B","children":[{"name":"C","children":[]}]},"name":"B1","children":[{"name":"C1","children":[]}]}]}
Tree2 = {"name":"A", "children":[{"name":"B", "children":[{"name":"C2", "children":[]}]}]}
merged = {"name":"A","children":[{"name":"B","children":[{"name":"C","children":[]},{"name":"C2","children":[]}]},{"name":"B1","children":[{"name":"C1","children":[]}]}]}
uj5u.com熱心網友回復:
您可以通過查看同一級別的名稱屬性進行合并。
這種方法回傳一個陣列,因為如果根的名稱不同,則結果至少包含兩個物件。
const
merge = (a, b) => {
if (!Array.isArray(a)) a = [a];
if (!Array.isArray(b)) b = [b];
return [...a, ...b].reduce((r, o) => {
const item = r.find(({ name }) => o.name === name);
if (item) item.children = merge(item.children, o.children);
else r.push(o);
return r;
}, []);
},
tree1 = { name: "A", children: [{ name: "B", children: [{ name: "C", children: [] }] }, { name: "B1", children: [{ name: "C1", children: [] }] }] },
tree2 = { name: "A", children: [{ name: "B", children: [{ name: "C2", children: [] }] }] },
result = merge(tree1, tree2);
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
uj5u.com熱心網友回復:
您可以使用遞回來合并您的樹:
function merge(...trees){
var m = {};
for (var i of trees){
m[i.name] = [...(i.name in m ? m[i.name] : []), ...i.children];
}
return Object.keys(m).map(function(x){return {name:x, children:m[x].length > 1 ? merge(...m[x]) : m[x]}})
}
uj5u.com熱心網友回復:
我們注意到收集的孩子串列和我們函式的初始引數的相似性,并且可以以簡單的遞回結束。在這里,我們將樹折疊成一個物件,其鍵是names,其值是收集的孩子。然后我們呼叫Object .entries它并將鍵值對映射到每個屬性中name(通過遞回呼叫) 。children僅此而已
const mergeTrees = (...trees) =>
Object .entries (trees .reduce ((a, {name, children = []}) => ({
...a,
[name]: (a [name] || []) .concat (children)
}), {})) .map (([k, v]) => ({name: k, children : mergeTrees (...v)}))
const tree1 = {name: "A", children: [{name: "B", children: [{name: "C", children: []}]}, {name: "B1", children: [{name: "C1", children: []}]}]}
const tree2 = {name: "A", children: [{name: "B", children: [{name: "C2", children: []}]}]}
console .log (mergeTrees (tree1, tree2))
.as-console-wrapper {max-height: 100% !important; top: 0}
請注意,我們回傳的是森林,而不是樹。如果您知道所有樹都具有相同的根,那么您可以從結果中提取第一個元素。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/425217.html
標籤:javascript json 递归 合并 树
上一篇:使用遞回的數字的每個磁區
