Javascript按值和父对象对对象数组进行特殊排序

问题描述

我想转换如下所示的对象数组:

const children = [
  { name: c1,parent: p1,draw_order: 1 },{ name: c2,parent: p2,draw_order: 2 },{ name: c3,draw_order: 4 },{ name: c4,draw_order: 3 },{ name: c5,parent: p3,];

1。我想创建一个包含父对象的新数组,如:

const parents = [
  { name:p1,draw_order: 1,children: [...] },{ name:p2,draw_order: 2,{ name:p3,]

父对象的 draw_order 应等于子对象的 draw_order 值的最小值。

类似于:

const parents = [];

children.forEach(c => {
  const parent = parents.find(p => p.name === c.name);
  parent ? parents.children.push(c) : parents.push({name: c.parent,children:[c})
})

parents.forEach(p => {
  const drawOrder = Math.min(...p.children.map(c => c.drawOrder));
  p.draw_order = drawOrder;
})

2。父母现在重复了 draw_order - 1,2,1; 我想将其更新为:

1 => 1,2 => 3,1 => 2

如果值为:[1,3,4,1,2]

1 => 1
3 => 4
4 => 6
4 => 7
1 => 2
3 => 5
2 => 3

最终结果应该是:

const parents = [
  { name:p1,draw_order: 3,]

只是为了检查我们是否有:

const children = [
  { name: c1,parent: p8,parent: p4,{ name: c6,draw_order: 9 },{ name: c7,];

输出应该是

const parents = [
  { name:p1,draw_order: 5,{ name:p4,draw_order: 4,{ name:p8,]

谢谢

解决方法

通过 parent 将孩子减少到父母的地图。如果 Map 中已存在父级,则将子级存储在子级数组中,并根据需要替换 draw_order

每当遇到新的父级时,使用父级的 name、基 draw_order(当前子级的)和一个带有当前子级的子级数组设置一个对象。使用 parent 作为地图的键。

使用 Array.from() 将 Map 的值转换为数组。

const children = [{"name":"c1","parent":"p1","draw_order":1},{"name":"c2","parent":"p2","draw_order":2},{"name":"c3","draw_order":4},{"name":"c4","draw_order":3},{"name":"c5","parent":"p3","draw_order":1}];

const result = Array.from(children.reduce((acc,o) => {
  if(acc.has(o.parent)) {
    const parent = acc.get(o.parent);

    parent.children.push(o);

    parent.draw_order = Math.min(o.draw_order,parent.draw_order);
  } else {
    acc.set(o.parent,{ 
      name: o.parent,draw_order: o.draw_order,children: [o] 
    });
  }

  return acc;
},new Map()).values());

console.log(result);

,

您可以通过收集所有值并重新映射新订单来创建新订单。

const
    array = [1,3,4,1,2],result = array
        .reduce((r,v,i) => ((r[v] ??= []).push(i),r),[])
        .flat()
        .reduce((v => (r,i) => (r[i] = v++,r))(1),[]);

console.log(...result);

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...