一旦条件满足,如何获取嵌套数组的id?

时间:2016-04-28 15:01:12

标签: javascript arrays

我是一个嵌套数组,一旦条件满足,它应该给出所有父ID,例如我有一个数据数组,我应该匹配

  • 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,
        "name": "Yes",
        "items": []
      }, {
        "id": 174,
        "name": "No",
        "items": [{
          "id": 100,
          "name": "test2",
          "items": [{
            "id": 189,
            "name": "Yes",
            "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, id, parentIds);
    }
  });
}

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




你能否就此提出任何建议?

2 个答案:

答案 0 :(得分:2)

这是一个很酷的问题。我花了比预期更多的东西来解决它,但这是一个breadth-first search实现:



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,
        "name": "Yes",
        "items": []
      }, {
        "id": 174,
        "name": "No",
        "items": [{
          "id": 100,
          "name": "test2",
          "items": [{
            "id": 189,
            "name": "Yes",
            "items": []
          }]
        }]
      }]
    }]
  }, {
    "id": 224,
    "name": "opt3",
    "items": []
  }]
}];


function parentsOf( arr, id, 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, id, 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, 182, []));
console.log("Array list for 174: " + parentsOf(data, 174, []));
&#13;
&#13;
&#13;

答案 1 :(得分:1)

如果重复完成此任务,首先将嵌套数组展平为哈希表是一种聪明的方法,其中键将是id属性。展平时,您可以向对象添加父属性。然后搜索将像访问哈希表上的对象属性一样简单快捷。以下说明了上述方法。

&#13;
&#13;
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,
        "name": "Yes",
        "items": []
      }, {
        "id": 174,
        "name": "No",
        "items": [{
          "id": 100,
          "name": "test2",
          "items": [{
            "id": 189,
            "name": "Yes",
            "items": []
          }]
        }]
      }]
    }]
  }, {
    "id": 224,
    "name": "opt3",
    "items": []
  }]
}],

getParents = (ar, id) => {var fData = (a, pid, pin) => a.reduce((p,c) => {c.parents = pid.concat();
                                                                          p[c.id] = c;
                                                                          c.items.length && fData(c.items, pid.concat(c.id), p);
                                                                          return p;
                                                                         }, pin);
                          return fData(ar,[],{})[id].parents;
                         }; //so much for getParents

document.write("<pre>" + JSON.stringify(getParents(data, 189), null, 2) + "</pre>");
&#13;
&#13;
&#13;