开发者问题收集

如何编码“在递归中使用的 DOM 方法的 ID”?

2020-03-10
108

我在'getObjectById 在递归中使用'中遇到问题。执行函数 getObject(data, '11') ---> undefined 。我不知道为什么会发生这种情况: undefined

在函数 getObject(data, '1'~'9') ---> 中我解决了。但是 '11' ,'12', '13', '14' ---> undefined

为了解决这个问题,我必须使用 forEachArray.prototype.apply ,但我无法解决它。

使用 filter ---> TypeError: 无法读取未定义的属性“filter”

使用 length ---> TypeError: 无法读取未定义的属性“length”

在第一行下,我遇到了需要解决的问题。在第二行下,我编写了解决该问题的代码。我认为我已经解释了解决问题的逻辑。但是在测试用例中,它失败了。

该问题的解决方案是:

let output = getObjectById(TREE_DATA.items, '1'))

console.log(output) --> { "id": "1", "name": "johnny" }
    --in first under line, 
    let TREE_DATA = {
      items: [
        {
          id: "1",
          name: "johnny"
        },
        {
          id: "2",
          name: "ingi",
          children: [
            {
              id: "3",
              name: "johnson"
            },
            {
              id: "4",
              name: "katy"
            },
            {
              id: "5",
              name: "steve",
              children: [
                {
                  id: "6",
                  name: "lisa"
                },
                {
                  id: "7",
                  name: "penny",
                  children: [
                    {
                      id: "8",
                      name: "john"
                    },
                    {
                      id: "9",
                      name: "hoyong"
                    }
                  ]
                },
                {
                  id: "10"
                }
              ]
            },
            {
              id: "11"
            },
            {
              id: "12"
            }
          ]
        },
        {
          id: "13"
        },
        {
          id: "14"
        }
      ]
    };

    --in second under line,

    function getObject(json, id) {
      let test = json.items;
      let newA = [];

      function getA(a, id) {
        a.filter(function(e) {
          console.log("this is : ", e);
          if (e.id && e.id === id) {
            return newA.push(e);

          } else if (e.id !== id && e.children) {
            return getA(e.children, id);
          }
        });
      }

      getA(test, id);
      return newA[0];
    }

2个回答

由于您的输入数据是递归结构,因此具有递归结构的程序将是最好的匹配。在这种情况下,您有 -

  • a 列表
  • 每个 节点 object )可能包含一个 儿童 属性 ,这也是 节点的

这种递归关系为我们提供了一个独特的机会,可以学习一种特殊类型的递归,其中一个函数 a ,调用函数 b function a ,称为 b ,依此类推...这称为 相互递归

仅采用输入节点的 一个 的函数,恰当地命名为 find1 。它接受一个单个节点,破坏了 儿童o ,以及搜索的ID, ID -

497063597

接下来很明显我们需要实现 findall 。它接受节点的A 列表 ,破坏了 first更多 ,以及搜索的ID, ID> ID -

455081724

就是这样!这些功能几乎写作,不需要外部变量或步骤。它的行为与我们期望的完全一样 -

490503177

通过运行下面的摘要 -

996454949 ,验证自己浏览器中的结果
Guest
2020-03-10

这是您要找的吗?

let TREE_DATA = {
  items: [
    {
      id: "1",
      name: "johnny"
    },
    {
      id: "2",
      name: "ingi",
      children: [
        {
          id: "3",
          name: "johnson"
        },
        {
          id: "4",
          name: "katy"
        },
        {
          id: "5",
          name: "steve",
          children: [
            {
              id: "6",
              name: "lisa"
            },
            {
              id: "7",
              name: "penny",
              children: [
                {
                  id: "8",
                  name: "john"
                },
                {
                  id: "9",
                  name: "hoyong"
                }
              ]
            },
            {
              id: "10"
            }
          ]
        },
        {
          id: "11"
        },
        {
          id: "12"
        }
      ]
    },
    {
      id: "13"
    },
    {
      id: "14"
    }
  ]
};

function getObject(json, id) {
  let test = json.items;
  let newA = [];

  function getA(a, id) {
    a &&
      a.forEach(function(e) {
        if (e.id === id) {
          newA.push(e);
        } else if (e.children) {
          getA(e.children, id);
        }
      });
  }

  getA(test, id);
  return newA[0];
}

function getObjectById(items, key) {
  let ret = {};

  for (let item of items) {
    if (item.id === key) {
      return item;
    }
    if (item.children) {
      let innerRet = getObjectById(item.children, key);
      if (Object.keys(innerRet).length) return innerRet;
    }
  }

  return ret;
}

console.log("2", getObjectById(TREE_DATA.items, "2"));
console.log("3", getObjectById(TREE_DATA.items, "3"));
console.log("11", getObjectById(TREE_DATA.items, "11"));
console.log("12", getObjectById(TREE_DATA.items, "12"));
console.log("13", getObjectById(TREE_DATA.items, "13"));

console.log("2", getObject(TREE_DATA, "2"));
console.log("3", getObject(TREE_DATA, "3"));
console.log("11", getObject(TREE_DATA, "11"));
console.log("12", getObject(TREE_DATA, "12"));
console.log("13", getObject(TREE_DATA, "13"));

编辑:调试并添加了您的功能。

dixitk13
2020-03-10