具有串联值的 objects 数组应移动到匹配值的 children

Array of objects with concatenated value should move to children of matching value

例如,我得到这个数组:

"items": [
{
  "value": "10",
  "label": "LIMEIRA",
  "children": []
},
{
  "value": "10-3",
  "label": "RECEBIMENTO",
  "children": []
},
{
  "value": "10-3-4",
  "label": "GAVETEIRO",
  "children": []
},
{
  "value": "10-3-4-A1",
  "label": "A1",
  "children": []
},
{
  "value": "10-3-4-A1-N1",
  "label": "N1",
  "children": []
},
{
  "value": "10-3-4-A1-N1-N2",
  "label": "N2",
  "children": []
},
{
  "value": "10-4",
  "label": "MEZANINO",
  "children": []
},
{
  "value": "10-4-4",
  "label": "GAVETEIRO",
  "children": []
},
{
  "value": "10-4-4-B1",
  "label": "B1",
  "children": []
},
{
  "value": "10-3-3",
  "label": "PRATELEIRA",
  "children": []
},
{
  "value": "10-3-3-C1",
  "label": "C1",
  "children": []
},
{
  "value": "10-3-3-C1-N1",
  "label": "N1",
  "children": []
},
{
  "value": "11",
  "label": "N & C BRASIL PROCESSAMENTO DE DADOS LTDA",
  "children": []
},
{
  "value": "11-4",
  "label": "MEZANINO",
  "children": []
},
{
  "value": "11-4-4",
  "label": "GAVETEIRO",
  "children": []
},
{
  "value": "11-4-4-A1",
  "label": "A1",
  "children": []
},
{
  "value": "11-4-4-A1-N2",
  "label": "N2",
  "children": []
},
{
  "value": "11-4-4-A1-N2-N2",
  "label": "N2",
  "children": []
},
{
  "value": "10-4-4-A1",
  "label": "A1",
  "children": []
},
{
  "value": "10-4-4-A1-N2",
  "label": "N2",
  "children": []
},
{
  "value": "10-4-4-A1-N2-N2",
  "label": "N2",
  "children": []
},
{
  "value": "11-4-4-A2",
  "label": "A2",
  "children": []
}
]

遍历我应该得到的每个值,例如:

{
   "value": "10",
   "label": "LIMEIRA",
   "children": [
        {
        "value": "10-3",
        "label": "RECEBIMENTO",
        "children": [... it should go on]
        }
   ]
}

我通过查找最新值尝试了 lodash 的一些东西,但没有成功,尝试将它们中的每一个都设置为“活动”并检查它是否与该值匹配并且具有 children,如果确实如此,再做一次,但仍然没有成功,我有什么想法可以做到吗?

您可以创建一个由所有项的 value 键控的映射,并建立父子关系,填充 children 属性 中少一个元素的项它的value。由值 "" 键控的虚拟根对象可以这样收集根对象:

const items = [{"value": "10","label": "LIMEIRA","children": []},{"value": "10-3","label": "RECEBIMENTO","children": []},{"value": "10-3-4","label": "GAVETEIRO","children": []},{"value": "10-3-4-A1","label": "A1","children": []},{"value": "10-3-4-A1-N1","label": "N1","children": []},{"value": "10-3-4-A1-N1-N2","label": "N2","children": []},{"value": "10-4","label": "MEZANINO","children": []},{"value": "10-4-4","label": "GAVETEIRO","children": []},{"value": "10-4-4-B1","label": "B1","children": []},{"value": "10-3-3","label": "PRATELEIRA","children": []},{"value": "10-3-3-C1","label": "C1","children": []},{"value": "10-3-3-C1-N1","label": "N1","children": []},{"value": "11","label": "N & C BRASIL PROCESSAMENTO DE DADOS LTDA","children": []},{"value": "11-4","label": "MEZANINO","children": []},{"value": "11-4-4","label": "GAVETEIRO","children": []},{"value": "11-4-4-A1","label": "A1","children": []},{"value": "11-4-4-A1-N2","label": "N2","children": []},{"value": "11-4-4-A1-N2-N2","label": "N2","children": []},{"value": "10-4-4-A1","label": "A1","children": []},{"value": "10-4-4-A1-N2","label": "N2","children": []},{"value": "10-4-4-A1-N2-N2","label": "N2","children": []},{"value": "11-4-4-A2","label": "A2","children": []}];

const children = [];
const map = new Map(items.map(o => [o.value, o])).set("", { children });
for (const o of items) map.get(o.value.replace(/-?[^-]+$/, "")).children.push(o);

console.log(children);