Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/rest/5.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中动态地将带有数组的深层JS对象减少为没有数组的JS对象?_Javascript_Arrays_Json_Object_Merge - Fatal编程技术网

如何在javascript中动态地将带有数组的深层JS对象减少为没有数组的JS对象?

如何在javascript中动态地将带有数组的深层JS对象减少为没有数组的JS对象?,javascript,arrays,json,object,merge,Javascript,Arrays,Json,Object,Merge,我有一个对象数组,每个对象都有一个id作为键。每个对象表示id的导航列表 我需要将所有导航列表合并到一个大列表中,其中叶包含所属ID 结果对象不应包含数组,而应包含作为ID列表的叶 我已经尝试过递归解决方案,像merge和assign这样的lodash函数,但我坚持使用对象的深度 输入JSON为,例如: [ { "id0": [ { "Topitem 1": [ { "Subitem 1": [

我有一个对象数组,每个对象都有一个id作为键。每个对象表示id的导航列表

我需要将所有导航列表合并到一个大列表中,其中叶包含所属ID

结果对象不应包含数组,而应包含作为ID列表的叶

我已经尝试过递归解决方案,像merge和assign这样的lodash函数,但我坚持使用对象的深度

输入JSON为,例如:

[
  {
    "id0": [
      {
        "Topitem 1": [
          {
            "Subitem 1": [
              "Leaf 1"
            ]
          }, {
            "Subitem 2": [
              "Leaf 2"
            ]
          }
        ]
      },
      {
        "Topitem 1": [
          {
            "Subitem 3": [
              "Leaf 1"
            ]
          }
        ]
      },
      {
        "Topitem 2": [
          "Leaf 1",
          "Leaf 3"
        ]
      },
      {
        "Topitem 3": [
          {
            "Subitem 1": [
              {
                "SubSubitem 1": [
                  "Leaf 4"
                ]
              }
            ]
          }
        ]
      }
    ]
  },
  {
    "id1": [
      "Leaf 5"
    ]
  },
  {
    "id2": [
      "Leaf 5"
    ]
  },
  {
    "id3": [
      {
        "Topitem 1": [
          "Leaf 1",
          {
            "Subitem 2": [
              "Leaf 2",
              "Leaf 3"
            ]
          }
        ]
      }, {
        "Topitem 2": [
          "Leaf 1",
          "Leaf 2"
        ]
      }
    ]
  },
  {
    "id4": [
      "Leaf 5"
    ]
  }
]
预期产出为:

{
  "Topitem 1": {
    "Subitem 1": {
      "Leaf 1": ["id0"]
    },
    "Subitem 2": {
      "Leaf 2": ["id0","id3"],
      "Leaf 3": ["id3"]
    },
    "Subitem 3": {
      "Leaf 1": ["id0"]
    },
    "Leaf 1": ["id3"]
  },
  "Topitem 2": {
    "Leaf 1": ["id0","id3"],
    "Leaf 2": ["id0","id3"]
  },
  "Topitem 3": {
    "Subitem 1": {
      "SubSubitem 1": {
        "Leaf 4": ["id0"]
      }
    }
  },
  "Leaf5": ["id1","id2","id4"]
}

您可以采取迭代和递归的方法,在第一次运行时使用一个独特的函数,在该函数中保存
id
,以便以后在数组中收集,然后对嵌套对象/键使用递归部分

给定数据结构的主要问题是,数组最后包含字符串而不是对象

函数转换(数组){
函数iter(数组、对象、值){
array.forEach(o=>{
如果(!o | | typeof o!=“object”){
(对象[o]=对象[o]| |[])。推送(值);
返回;
}
对象
.条目(o)
.forEach([k,v])=>iter(v,object[k]=object[k]|{},value));
});
}
var result={};
forEach(o=>Object.entries(o.forEach)([k,v])=>iter(v,result,k));
返回结果;
}
变量数据=[{id0:[{“Topitem 1”:[{“子项1”:[“叶1”]},{“子项2”:[“叶2”]},{“Topitem 1”:[{“子项3”:[“叶1”]}],{“Topitem 2”:[“叶1”,“叶3”},{“Topitem 3”:[{“子项1”:[“叶4”]}]}}]},{“子项1:[“叶5”}],{“叶5”},{“叶5”},{子项1:{“叶1”},{id1:{“叶5”},{Topitem:{[“叶2”,“叶3”]},{“顶项2”:[“叶1”,“叶2”]},{id4:[“叶5”]}];
console.log(转换(数据));
.as控制台包装{max height:100%!important;top:0;}
这是一个使用and的解决方案。此解决方案不需要递归

//const objectScan=require('object-scan');
//const lodash=需要(“lodash”);
常量myObject=[{id0:[{'Topitem 1':[{'Subitem 1':['Leaf 1']},{'Subitem 2':['Leaf 2']},{'Topitem 1':[{'Subitem 3':['Leaf 1']},{'Topitem 2':['Leaf 1','Leaf 3']},{'Topitem 3':[{'Subitem 1':['SubSubSubSubSubSubSubItem 1':['Leaf 4']}]}]}]},{'Leaf 5']},{'Leaf 5'.['Topitem 1']},{',{'子项2':['Leaf 2','Leaf 3']}},{'Topitem 2':['Leaf 1','Leaf 2']}},{id4:['Leaf 5']};
const convert=(obj)=>objectScan(['**']{
filterFn:({key,value,context})=>{
如果(值的类型!=='string'){
返回;
}
常量k=[…key.slice(2).filter((e)=>typeof e==='string'),value];
const cur=lodash.get(上下文,k);
如果(cur==未定义){
set(上下文,k,[key[1]]);
}否则{
电流推送(键[1]);
}
}
})(obj,{});
console.log(convert(myObject));
//=>{'Leaf 5':['id4','id2','id1'],'Topitem 2':{'Leaf 2':['id3'],'Leaf 1':['id3','id0'],'Leaf 3':['id0'],'Leaf 3':['id3'],'id0'],'Leaf 1':['id3'],'Subitem 3':['id3'],'Leaf 1':['id0'],'id0'],'Leaf 1':['id0'],'Topitem},'{'subsubsubitem 1':{'Leaf 4':['id0']}}}}
。作为控制台包装{最大高度:100%!重要;顶部:0}