【问题标题】:Looping through (possibly infinitely) repeating object structure循环(可能无限)重复的对象结构
【发布时间】:2019-02-04 12:24:17
【问题描述】:

我有一个问题,我无法解决问题。如果我在一个可能无限的数据结构中寻找具有特定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

【问题讨论】:

标签: javascript recursion


【解决方案1】:

你需要存储中间结果,只返回找到的对象。

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);

【讨论】:

  • .find 这里可能比.some 更合适
  • @user633183,不,因为它需要更深的找到的对象,而不是实际的对象,它会在 find 时返回。
  • 尼娜,我知道你现在是如何使用它的。偷偷摸摸的副作用骗了我^_^
【解决方案2】:

情况就是这样。当您进入“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;
        }
   }
}

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

【讨论】:

  • 非常感谢您的解释,这解决了我的问题。我需要好好看看这个,这样我才能理解为什么会这样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-22
  • 2020-07-26
  • 1970-01-01
  • 2020-06-06
  • 2014-03-09
  • 1970-01-01
相关资源
最近更新 更多