【问题标题】:Array of objects with concatenated value should move to children of matching value具有连接值的对象数组应移动到匹配值的子项
【发布时间】:2021-10-07 13:48:23
【问题描述】:

例如,我得到了这个数组:

"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 的东西,但没有成功,尝试将它们中的每一个都设为“活动”,并检查它是否与值匹配并有子项,如果匹配,请执行一次再次,但仍然没有成功,任何想法我怎么能做到这一点?

【问题讨论】:

    标签: javascript arrays json tree nested


    【解决方案1】:

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

    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);

    【讨论】:

    • 它完美无瑕,尽管代码对我来说似乎有点混乱(可能是因为我从未使用过地图),感谢您的帮助!
    猜你喜欢
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-22
    • 2019-09-28
    相关资源
    最近更新 更多