我在比較 2 個物件陣列時遇到問題。我正在搜索 lodash 檔案,但找不到合適的方法。問題是我需要用不同的鍵比較物件。
private parentArray: {}[] = [
{ Id: 1, Name: 'A' },
{ Id: 2, Name: 'B' },
{ Id: 3, Name: 'C' },
{ Id: 4, Name: 'D' }
];
private childArray: {}[] = [
{ Id: 2, parentId: 2, Name: 'a' },
{ Id: 3, parentId: 2, Name: 'b' },
{ Id: 4, parentId: 4, Name: 'c' },
{ Id: 5, parentId: 4, Name: 'd' }
];
我需要創建一個新的嵌套物件陣列,其中“parentId”將與父級的“Id”匹配,如下所示:
private newArray = [
{ Id: 1, Name: 'A', Children: [] },
{
Id: 2,
Name: 'B',
Children: [
{ Id: 2, parentId: 2, Name: 'a' },
{ Id: 3, parentId: 2, Name: 'b' }
]
},
{
Id: 3,
Name: 'C',
Children: []
},
{
Id: 4,
Name: 'D',
Children: [
{ Id: 4, parentId: 4, Name: 'c' },
{ Id: 5, parentId: 4, Name: 'd' }
]
}
];
我正在使用 '.intersectionWith([arrays], [comarator])' 和 '.isMatchWith(object, source, [customizer])' 但它沒有給我我需要的東西。我將不勝感激任何幫助。
uj5u.com熱心網友回復:
最簡單的方法可能是
const newArray = parentArray.map(
p => ({ ...p, Children: childArray.filter(c => c.parentId === p.Id) })
)
這會導致您正在尋找的輸出。parentArray
請注意,在和很大的情況下,這不一定是性能最好的演算法childArray
,因為我們正在對整個childArray
中的每個元素進行回圈parentArray
(因此,如果childArray
長度為??且parentArray
長度為??,則此演算法為O (??×??)) .
如果這樣的性能很重要,那么您可以通過一次迭代每個元素來做到這childArray
一點(假設哈希查找為O (1),parentArray
即O (?? ??) ),如下所示:
type Parent = typeof parentArray[number];
type Child = typeof childArray[number];
interface New extends Parent {
Children: Child[];
}
const newArray: New[] = [];
const parentLookup: Record<number, New> = {};
for (const p of parentArray) {
const n = { ...p, Children: [] };
newArray.push(n)
parentLookup[p.Id] = n;
}
for (const c of childArray) {
parentLookup[c.parentId]?.Children.push(c);
}
console.log(newArray);
Playground 代碼鏈接
uj5u.com熱心網友回復:
type Parent = {
Id: number,
Name: string,
}
type Child = Parent & {
parentId: number;
}
type ParentAndChildren = {
Children: Child[]
} & Parent
const parents: Parent[] = [
{ Id: 1, Name: 'A' },
{ Id: 2, Name: 'B' },
{ Id: 3, Name: 'C' },
{ Id: 4, Name: 'D' }
];
const children: Child[] = [
{ Id: 2, parentId: 2, Name: 'a' },
{ Id: 3, parentId: 2, Name: 'b' },
{ Id: 4, parentId: 4, Name: 'c' },
{ Id: 5, parentId: 4, Name: 'd' }
];
const output = parents.map((p: Parent): ParentAndChildren => {
return {
Id: p.Id,
Name: p.Name,
Children: children.filter((c) => p.Id === c.parentId),
}
})
console.log(output);
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/507800.html