javascript – 如果满足条件,如何获取嵌套数组的ids?

我有一个嵌套的数组,一旦满足条件,它应该给所有的父代码,例如我有一个数据数组,我应该在其中匹配

> getParentIds(data,182,[]);

>结果:[96,182];

> getParentIds(data,174,[]);

>结果:[109,219,76,174];

var data = [{
  "id": 96,"name": "test1","items": [{
    "id": 181,"name": "Yes","items": []
  },{
    "id": 182,"name": "No","items": []
  }]
},{
  "id": 109,"name": "Test5","items": [{
    "id": 219,"name": "opt2","items": [{
      "id": 76,"name": "test3","items": [{
        "id": 173,"items": []
      },{
        "id": 174,"items": [{
          "id": 100,"name": "test2","items": [{
            "id": 189,"items": []
          }]
        }]
      }]
    }]
  },{
    "id": 224,"name": "opt3","items": []
  }]
}];


function getParentIds(data,id,parentIds) {
  if (!parentIds) {
    parentIds = [];
  }
  data.map(function(item) {
    if (item.id === id) {
      parentIds.push(item.id);
      return parentIds;
    } else if (item.items.length === 0) {
      // do nothing
    } else {
      return getParentIds(item.items,parentIds);
    }
  });
}

console.log("Array list: " + getParentIds(data,[]));

你能给我任何建议吗?

解决方法

这是一个很酷的问题.我花了比我预期的更多,但这是一个 breadth-first search的实现:
var data = [{
  "id": 96,"items": []
  }]
}];


function parentsOf( arr,parents){
    if (parents.length)
        return parents;
    // I use for(;;) instead of map() because I need the return to exit the loop
    for (var i = 0; i < arr.length; i++){
        if ( arr[i].id == id){
             //push the current element at the front of the parents array
             parents.unshift( arr[i].id );
             return parents;
        };
        if ( arr[i].items ){
            parents = parentsOf(arr[i].items,parents);
            // if the parents array has any elements in it it means we found the child
            if (parents.length){
                parents.unshift(arr[i].id);
                return parents;
            }
        }
    }
    return parents;
}

console.log("Array list for 182: " + parentsOf(data,[]));
console.log("Array list for 174: " + parentsOf(data,[]));

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...