循环(可能无限地)重复对象结构

时间:2018-08-29 16:23:11

标签: javascript recursion

我有一个问题,我无法理解。如果我正在可能无限的数据结构中寻找具有某个ID的对象,如何遍历该对象,直到找到所需的对象并返回该对象?

如果这是我的数据,那么如何使用id === 3获取对象?

{
  id: 0,
  categories: [
    {
      id: 1,
      categories: [
        {
          id: 2,
          categories: [ ... ]
        },
        {
          id: 3,
          categories: [ ... ]
        },
        {
          id: 4,
          categories: [ ... ]
        },
      ]
    }
  ]
}

我尝试了以下操作:

findCategory = (categoryID, notesCategory) => {
  if (notesCategory.id === categoryID) {
    return notesCategory;
  }
  for (let i = 0; i < notesCategory.categories.length; i += 1) {
    return findCategory(categoryID, notesCategory.categories[i]);
  }

  return null;
};

但这并没有达到id === 3。它使用id: 2检查对象,然后返回null。它永远不会通过id: 3到达对象。

这是一个JSbin:https://jsbin.com/roloqedeya/1/edit?js,console

2 个答案:

答案 0 :(得分:1)

是这种情况。当您进入“ for”循环的第一次迭代时,由于有返回调用,执行将从函数中退出。您可以使用console.log在函数的开头打印当前对象来进行检查。

尝试

function find(obj, id) {
    if(obj.id === id) {
        console.log(obj) // just for testing. you can remove this line
        return obj
    } else {
        for(var i = 0; i < obj.categories.length; i++) {
            var res = find(obj.categories[i], id);
            if(res) return res;
        }
   }
}

希望这会对您有所帮助。谢谢

答案 1 :(得分:0)

您需要存储中间结果,并且仅返回找到的对象。

function findCategory(object, id) {
    var temp;
    if (object.id === id) {
        return object;
    }
    object.categories.some(o => temp = findCategory(o, id));    
    return temp;
}

var data = { id: 0, categories: [{ id: 1, categories: [{ id: 2, categories: [] }, { id: 3, categories: [] }, { id: 4, categories: [] }] }] }
    result = findCategory(data, 3);
  
console.log(result);