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

Javascript 如何提取到';启用';嵌套对象数组中的对象

Javascript 如何提取到';启用';嵌套对象数组中的对象,javascript,arrays,recursion,Javascript,Arrays,Recursion,我是递归的新手,我有一个包含嵌套对象数组的JSON结构。其中一些对象启用了布尔值:true。我试图找出如何提取所有启用对象及其子对象的路径 我试图通过删除未使用的路径来清理原始对象,但在访问父对象时迷失了方向。我还尝试使用点符号构建一个单独的路径数组,因为我可能可以从中构建一个新的嵌套对象。我最近一次尝试点符号提取: const sourceData = { title: "Work", tags: [ { title: "C

我是递归的新手,我有一个包含嵌套对象数组的JSON结构。其中一些对象启用了布尔值:true。我试图找出如何提取所有启用对象及其子对象的路径

我试图通过删除未使用的路径来清理原始对象,但在访问父对象时迷失了方向。我还尝试使用点符号构建一个单独的路径数组,因为我可能可以从中构建一个新的嵌套对象。我最近一次尝试点符号提取:


    const sourceData = {
      title: "Work",
      tags: [
        {
          title: "Cleaning",
          tags: [
            {
              title: "Floors"
            },
            { title: "Windows", enabled: true },
            { title: "Ceilings", enabled: true }
          ]
        },
        {
          title: "Maintenance",
          tags: [
            {
              title: "Walls",
              enabled: true,
              tags: [
                {
                  title: "Brickwall"
                },
                {
                  title: "Wooden wall"
                }
              ]
            },
            {
              title: "Roof"
            }
          ]
        },
        {
          title: "Gardening"
        }
      ]
    };

    function getEnabledPaths(level, acc) {
      for (const tag of level.tags) {
        if (tag.enabled) {
          return tag.title;
        } else if (tag.hasOwnProperty("tags")) {
          var path = this.getEnabledPaths(tag);
          if (path) acc.push(tag.title + "." + path);
        }
      }
      return acc;
    }

    console.log(getEnabledPaths(sourceData, []));

我只得到:

    [
      "Cleaning.Windows",
      "Maintenance.Walls"
    ]
我理想的结局是这样的:

    [
      'Work.Cleaning.Windows',
      'Work.Cleaning.Ceilings',
      'Work.Maintenance.Walls.Brickwall',
      'Work.Maintenance.Walls.Wooden Wall'
    ]
在一个完美的世界中(但我尝试了几天,然后又回去得到点符号的结果):


如果在某些较高级别上找到真值,并且基于该结果添加路径,则可以将
enabled
参数向下传递到较低级别的递归

const data={“title”:“Work”,“tags”:[{“title”:“Cleaning”,“tags”:[{“title”:“Floors”},{“title”:“Windows”,“enabled”:true},{“title”:“designed”:true},{“title”:“Maintenance”,“tags”:[{“title”:“Walls”,“enabled”:true,“tags”:[{“title”:“Brickwall”},{“title”:“woodwall”},},{“title”:“Roof”},{“Roof”},{“grounding”},}
函数路径(数据,prev='',enabled=false){
常量结果=[];
prev+=(prev?.“:”)+data.title;
如果(!enabled&&data.enabled)enabled=true;
如果(!data.tags){
如果(已启用){
结果:推送(prev);
}
}否则{
data.tags.forEach(el=>result.push(…路径(el,prev,enabled)))
}
返回结果;
}
常量结果=路径(数据)

console.log(result)
递归函数的关键是a)处理子项和b)项本身

以下是我的观点,似乎很有效:

const sourceData={title:“工作”,标签:[{title:“清洁”,标签:[{title:“地板”},{title:“窗户”,enabled:true},{title:“天花板”,enabled:true},{title:“维护”,标签:[{title:“墙”,enabled:true,标签:[{{title:“砖墙”},{title:“木墙”},{title:“屋顶”},{title:“园艺”}};
函数项过滤器(项){
//启用?此项目已完成
如果(项目启用)返回项目;
//未启用且无标签?设置为空
如果(!item.tags)返回null;
//筛选所有子项,删除空子项
item.tags=item.tags.map(child=>itemFilter(child)).filter(child=>child);
退货项目;
}
log(itemFilter(sourceData))
。作为控制台包装器{
最大高度:100vh!重要;
}

    {
      title: "Work",
      tags: [
        {
          title: "Cleaning",
          tags: [
            {
              title: "Windows",
              enabled: true
            },
            {
              title: "Ceilings",
              enabled: true
            }
          ]
        },
        {
          title: "Maintenance",
          tags: [
            {
              title: "Walls",
              enabled: true,
              tags: [
                {
                  title: "Brickwall"
                },
                {
                  title: "Wooden wall"
                }
              ]
            }
          ]
        }
      ]
    };