Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript按值和父对象对对象的特殊排序数组_Javascript_Arrays_Sorting_Parent_Children - Fatal编程技术网

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

Javascript按值和父对象对对象的特殊排序数组,javascript,arrays,sorting,parent,children,Javascript,Arrays,Sorting,Parent,Children,我想转换一组如下所示的对象: const children = [ { name: c1, parent: p1, draw_order: 1 }, { name: c2, parent: p2, draw_order: 2 }, { name: c3, parent: p2, draw_order: 4 }, { name: c4, parent: p1, draw_order: 3 }, { name: c5, parent: p3, draw_order: 1 }, ]

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

const children = [
  { name: c1, parent: p1, draw_order: 1 },
  { name: c2, parent: p2, draw_order: 2 },
  { name: c3, parent: p2, draw_order: 4 },
  { name: c4, parent: p1, draw_order: 3 },
  { name: c5, parent: p3, draw_order: 1 },
];
1。我想创建一个包含父对象的新数组,如:

const parents = [
  { name:p1, draw_order: 1, children: [...] },
  { name:p2, draw_order: 2, children: [...] },
  { name:p3, draw_order: 1, children: [...] },
]
父对象的绘制顺序应等于子对象的绘制顺序值中的最小值

比如:

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。父母现在重复了抽签顺序-1,2,1; 我想将其更新为:

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

1 => 1
3 => 4
4 => 6
4 => 7
1 => 2
3 => 5
2 => 3
最终结果应该是:

const parents = [
  { name:p1, draw_order: 1, children: [...] },
  { name:p2, draw_order: 3, children: [...] },
  { name:p3, draw_order: 2, children: [...] },
]
仅用于检查我们是否有:

const children = [
  { name: c1, parent: p1, draw_order: 1 },
  { name: c2, parent: p8, draw_order: 2 },
  { name: c3, parent: p2, draw_order: 4 },
  { name: c4, parent: p1, draw_order: 3 },
  { name: c5, parent: p4, draw_order: 3 },
  { name: c6, parent: p4, draw_order: 9 },
  { name: c7, parent: p3, draw_order: 1 },
];
产出应为:

const parents = [
  { name:p1, draw_order: 1, children: [...] },
  { name:p2, draw_order: 5, children: [...] },
  { name:p3, draw_order: 2, children: [...] },
  { name:p4, draw_order: 4, children: [...] },
  { name:p8, draw_order: 3, children: [...] },
]

谢谢

通过
parent
将孩子简化为父母地图。如果映射中已存在父对象,请将子对象存储在子对象数组中,并根据需要替换
draw\u order

每当遇到新的父对象时,使用父对象的
名称
、基对象
绘制顺序
(当前子对象)和具有当前子对象的子数组设置对象。使用
父项
作为地图的键

使用
array.from()
将贴图的值转换为数组

const children=[{“name”:“c1”,“parent”:“p1”,“draw_order”:1},{“name”:“c2”,“parent”:“p2”,“draw_order”:2},{“name”:“c3”,“parent”:“p2”,“draw_order”:4},{“name”:“c4”,“parent”:“p1”,“draw_order”:3},{“name”:“c5”,“parent”:“p3”,“draw_order”:1};
const result=Array.from(children.reduce)(acc,o)=>{
如果(附件有(o.母公司)){
const parent=acc.get(o.parent);
父母。孩子。推(o);
parent.draw\u order=Math.min(o.draw\u order,parent.draw\u order);
}否则{
acc.set(o.parent,{
姓名:o.parent,
抽签顺序:o.抽签顺序,
儿童:[o]
});
}
返回acc;
},新映射())。值());

控制台日志(结果)
通过
parent
将子对象减少为父对象的映射。如果映射中已存在父对象,请将子对象存储在子对象数组中,并根据需要替换
draw\u order

每当遇到新的父对象时,使用父对象的
名称
、基对象
绘制顺序
(当前子对象)和具有当前子对象的子数组设置对象。使用
父项
作为地图的键

使用
array.from()
将贴图的值转换为数组

const children=[{“name”:“c1”,“parent”:“p1”,“draw_order”:1},{“name”:“c2”,“parent”:“p2”,“draw_order”:2},{“name”:“c3”,“parent”:“p2”,“draw_order”:4},{“name”:“c4”,“parent”:“p1”,“draw_order”:3},{“name”:“c5”,“parent”:“p3”,“draw_order”:1};
const result=Array.from(children.reduce)(acc,o)=>{
如果(附件有(o.母公司)){
const parent=acc.get(o.parent);
父母。孩子。推(o);
parent.draw\u order=Math.min(o.draw\u order,parent.draw\u order);
}否则{
acc.set(o.parent,{
姓名:o.parent,
抽签顺序:o.抽签顺序,
儿童:[o]
});
}
返回acc;
},新映射())。值());

控制台日志(结果)您可以通过收集所有值并重新映射新订单来创建新订单

const
数组=[1,3,4,4,1,3,2],
结果=数组
.reduce((r,v,i)=>((r[v]?=[])。push(i,r),[]))
.flat()
.reduce((v=>(r,i)=>(r[i]=v++,r))(1),[]);

console.log(…结果)您可以通过收集所有值并重新映射新订单来创建新订单

const
数组=[1,3,4,4,1,3,2],
结果=数组
.reduce((r,v,i)=>((r[v]?=[])。push(i,r),[]))
.flat()
.reduce((v=>(r,i)=>(r[i]=v++,r))(1),[]);
console.log(…结果)