当前位置: 代码迷 >> JavaScript >> 迭代嵌套对象并使用 es6+ 按值获取 obj
  详细解决方案

迭代嵌套对象并使用 es6+ 按值获取 obj

热度:117   发布时间:2023-06-06 10:26:00.0

对于这种结构的对象:

const myObj = {
  id: 1,
  name: '1',
  children: [
    {
      id: 2,
      name: '2',
      children: [
        {
          id: 3,
          name: '3',
          children: []
        }
      ]
    },
    {
      id: 4,
      name: '4',
      children: [
        {
          id: 5,
          name: '5',
          children: [
            {
              id: 6,
              name: '6',
              children: [
                {
                  id: 7,
                  name: '7',
                  children: []
                }
              ]
            }
          ]
        }
      ]
    },
  ]
}

我如何按值(id)获取对象? 所以我正在寻找一个函数,如果我调用它:

findObj(myObj, 6);

它会返回这个:

       {
          id: 6,
          name: '6',
          children: [
            {
              id: 7,
              name: '7',
              children: []
            }
          ]
        }

另一个例子:

findObj(myObj, 3);

会返回这个:

    {
      id: 3,
      name: '3',
      children: []
    }

我知道我需要一个递归函数。 这是我到目前为止所拥有的:

  findObj(obj, id) {
    if (obj.id === id) {
      return obj;
    }

    obj.forEach(x => {
      if (x.id === id) {
        return x;
      } else {
        this.findObj(x.children, id);
      }
    });
  }

(这是一个角度类)

乍一看,我看到了一些问题。

如果您已经在函数中拥有ob.id === id ,则您无需稍后再检查它。 此外,如果findObj是一个在作用域中定义的函数,与任何其他变量一样,并且不在“类”定义中,则您不需要通过this调用它,就像第一次调用findObj一样,没有this关键字。

此外,首先您将一个对象传递给您的方法,然后您传递一个对象数组( obj.children ),并且您还在forEach方法中检查 id ,您在其中传递一个函数( x => { ... thingy),所以当你返回时,你从那个函数而不是主函数返回。

我已经为你修好了。 我建议您了解正在发生的事情并从中学习,因为如果您知道自己在做什么,这将不会发生(调试在这里是您的主人)。

findObj(obj, id) {
    if (obj.id === id) {
        return obj;
    }
    for (var i = 0; i < obj.children.length; i++) { // No forEach, so when we return, we actually return from findObj
        var r = findObj(obj.children[i], id); // We see if we have any return and let the "check logic" be defined on one location instead of duplicated.
        if (r) {
            return r;
        }
    }
}

两个问题:

  • 你的return x; 语句仅从forEach回调中返回,而不是从findObj函数中返回。 不要使用forEach 一个简单的for … of循环就可以了
  • 如果您的递归调用找到该对象并返回它,您将忽略它并继续迭代。 检查您是否得到结果并适当处理。

我猜你不是在寻找完整的解决方案,所以我把它留作练习:-)

您可以检查对象或检查孩子。

 function find(object, id) { var result; if (object.id === id) return object; object.children.some(o => result = find(o, id)); return result; } const object = { id: 1, name: '1', children: [{ id: 2, name: '2', children: [{ id: 3, name: '3', children: [] }] }, { id: 4, name: '4', children: [{ id: 5, name: '5', children: [{ id: 6, name: '6', children: [{ id: 7, name: '7', children: [] }] }] }] }] }; console.log(find(object, 5)); console.log(find(object, 6));
 .as-console-wrapper { max-height: 100% !important; top: 0; }

  相关解决方案