簡體   English   中英

Javascript 按值和父對象的特殊排序數組

[英]Javascript special sorting array of objects by value and parent

我想轉換一個看起來像這樣的對象數組:

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 . 我想創建一個包含父 object 的新數組,例如:

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

父 Object 的 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, 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將孩子減少到父母的 Map 。 如果 Map 中已經存在父級,則將子級存儲在子級數組中,並根據需要替換draw_order

每當遇到新的父級時,使用父級的name設置一個 object ,base draw_order (當前子級的)和當前子級的子級數組。 使用parent作為 Map 的鍵。

使用Array.from()將 Map 的值轉換為數組。

 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) => { 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, 4, 1, 3, 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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM