我在比较两个对象数组时遇到问题.我在搜索Lotash文档,但我找不到合适的方法. 问题是,我需要通过不同的键比较对象.

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([Arrads],[Compare])’和‘.isMatchWith(Object,SOURCE,[Customizer])’,但它没有提供我需要的东西. 如有任何帮助,我将不胜感激.

推荐答案

要做到这一点,最简单的方法可能是

const newArray = parentArray.map(
    p => ({ ...p, Children: childArray.filter(c => c.parentId === p.Id) })
)

这将产生您正在寻找的输出.请注意,在parentArraychildArray较大的情况下,这不一定是性能最好的算法,因为我们为parentArray中的每个元素循环整个childArray(因此,如果childArray是长度????,parentArray是长度????,则该算法是O(????×????)).

如果这样的性能很重要,那么您可以通过迭代childArrayparentArray中的每个元素一次(假设散列查找是O(1))来实现这一点,如下所示:

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 link to code

Javascript相关问答推荐

如何才能获取API的所有19页,而不是仅获取我已经编写的代码中的第一页?

使用JavaScript单击上一个或下一个特定按钮创建卡滑动器以滑动单个卡

使用axios.获取实时服务器时的404响应

django无法解析余数:[0] from carray[0]'

PrivateRoute不是路由组件错误

如何为我的astro页面中的相同组件自动创建不同的内容?

Google maps API通过API返回ZERO_RESULTS,以获得方向请求,但适用于Google maps

在我的html表单中的用户输入没有被传送到我的google表单中

v—自动完成不显示 Select 列表中的所有项目

Angular 中的类型错误上不存在获取属性

变量的值在Reaction组件中的Try-Catch语句之外丢失

未定义引用错误:未定义&Quot;而不是&Quot;ReferenceError:在初始化&Quot;之前无法访问';a';

为什么123[';toString';].long返回1?

如何在ASP.NET项目中使用Google Chart API JavaScript将二次轴线值格式化为百分比

TypeError:无法读取未定义的属性(正在读取';宽度';)

如何在我的Next.js项目中.blob()我的图像文件?

如何在HTMX提示符中设置默认值?

将范围 Select 器添加到HighChart面积图

构建器模式与参数对象输入

如果NetSuite中为空,则限制筛选