Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/396.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_Reduce_Flatten - Fatal编程技术网

Javascript 深藏地图

Javascript 深藏地图,javascript,reduce,flatten,Javascript,Reduce,Flatten,我需要得到一个大收藏的所有“id”和“名称”。对象的数组,该数组具有带对象的数组(等) 我不能让它工作,没有手动做foreaches为许多水平,这是丑陋的 我使用的是Lodash,所以使用它的解决方案会很好 以下是该系列的外观: [ { "id": 1, "name": "Living", "numberStories": 0, "subcategories": { "data": [ { "id": 2,

我需要得到一个大收藏的所有“id”和“名称”。对象的数组,该数组具有带对象的数组(等)

我不能让它工作,没有手动做foreaches为许多水平,这是丑陋的

我使用的是Lodash,所以使用它的解决方案会很好

以下是该系列的外观:

[
  {
    "id": 1,
    "name": "Living",
    "numberStories": 0,
    "subcategories": {
      "data": [
        {
          "id": 2,
          "name": "Fashion",
          "numberStories": 0,
          "subcategories": {
            "data": [
              {
                "id": 3,
                "name": "Accessories",
                "numberStories": 0,
                "subcategories": {
                  "data": [

                  ]
                }
              },
              {
                "id": 4,
                "name": "Kid's Fashion",
                "numberStories": 0,
                "subcategories": {
                  "data": [

                  ]
                }
              }, (... etc)
因此,它需要查看每个对象数组中的子类别,并收集id和名称,以便最终得到所有级别的所有id名称


谢谢。

没有必要为此使用lodash。使用
.reduce()
的简单递归函数可以为您完成这项工作

function flattenId(inArray){
 return inArray.reduce(function(output, elem){
   output.push(elem.id);
   return output.concat(flattenId(elem.subcategories.data));
  }, []);
}

如上所述,使用本机javascript可能更容易做到这一点,因为它是递归的。这与前面的答案相同,但使用了ES6的一些很酷的功能(解构、rest参数、箭头函数、默认参数),它将保存对父id的引用,以便您可以在需要时重建类别树

const categories=[{id:1,name:“Living”,numberStories:0,子类别:{data:[{id:2,name:“Fashion”,numberStories:0,子类别:{data:[{id:3,name:“Accessories”,numberStories:0,子类别:{data:[]},{id:4,name:“Kid's Fashion”,numberStories:0,子类别:{data:[]}}};
const flattcategories=(categories,parent=null,ret=[])=>
categories.reduce((acc,{id,name,subcategories:{data})=>
根据康卡特(
{id,name,parent},
…类别(数据、id)
)
,ret)
console.log(
类别(类别)
)
.as控制台包装{top:0;最大高度:100%!important}
这里是一个使用的解决方案。根据您的用例,使用库可能有些过分,但如果需要,它可以给您更多的灵活性

//const objectScan=require('object-scan');
const categories=[{id:1,name:'Living',numberStories:0,子类别:{data:[{id:2,name:'Fashion',numberStories:0,子类别:{data:'3,name:'Accessories',numberStories:0,子类别:{data:[]},{id:4,name:'Kid'Fashion',numberStories:0,子类别:{data:[]}}}];
常量r=objectScan(['**[*].id']{
filterFn:({context,value,parents})=>{
上下文推送({
id:值,
名称:父项[0]。名称,
父项:parents.length>2?父项[3]。id:null
});
}
})(类别,[]);
控制台日志(r);
//=>[{id:4,名称:“孩子的时尚”,家长:2},{id:3,名称:“配饰”,家长:2},{id:2,名称:“时尚”,家长:1},{id:1,名称:“生活”,家长:空}]
。作为控制台包装{最大高度:100%!重要;顶部:0}