首页 > 解决方案 > 嵌套对象的递归函数返回未定义

问题描述

我正在遍历对象的嵌套对象,寻找一个特定的对象,如果我找到它,我会做一些事情。我可以让它为第一个嵌套工作,但之后的任何嵌套我都会得到一个未定义的值。

let myObj = [{
    id: 1,
    children: [{
        id: 1.1,
        children: []
      },
      {
        id: 1.2,
        children: []
      }
    ]
  },
  {
    id: 2,
    children: [{
        id: 2.1,
        children: []
      },
      {
        id: 2.2,
        children: []
      }
    ]
  }
]


function addToObj(itemToAdd, parentId, obj) {

  for (let i = 0; i < obj.length; i++) {

    const item = search(obj[i], parentId);

    console.log(item); // undefined

    if (item) {
      item.children = item.children.concat(itemToAdd);
      break;
    }
  }

  function search(obj, id) {
    if (obj.id === id) {
      console.log(obj); // defined (obj with id of 2.1), but returns undefined?
      return obj;
    }

    for (let i = 0; i < obj.children.length; i++) {
      search(obj.children[i], id);
    }
  }

  return obj;
};

const itemToAdd = {
  id: 100,
}

addToObj(itemToAdd, 2.1, myObj);

上述代码段中的函数循环遍历对象,查找特定项目。如果它找到该项目,它会将一个对象插入到该项目的子属性中。

标签: javascript

解决方案


您需要使用递归的返回值search:如果存在,则返回它:

for (let i = 0; i < obj.children.length; i++) {
  const possibleResult = search(obj.children[i], id);
  if (possibleResult) {
    return possibleResult;
  }
}

let myObj = [{
    id: 1,
    children: [{
        id: 1.1,
        children: []
      },
      {
        id: 1.2,
        children: []
      }
    ]
  },
  {
    id: 2,
    children: [{
        id: 2.1,
        children: []
      },
      {
        id: 2.2,
        children: []
      }
    ]
  }
]


function addToObj(itemsToAdd, parentId, obj) {

  for (let i = 0; i < obj.length; i++) {

    const item = search(obj[i], parentId);

    // first log here will be undefined, nothing found
    // second log here will find the object
    console.log('item', item);

    if (item) {
      item.children = item.children.concat(itemsToAdd);
      break;
    }
  }

  function search(obj, id) {
    if (obj.id === id) {
      console.log('obj', obj); // defined (obj with id of 2.1), but returns undefined?
      return obj;
    }

    for (let i = 0; i < obj.children.length; i++) {
      const possibleResult = search(obj.children[i], id);
      if (possibleResult) {
        return possibleResult;
      }
    }
  }

  return obj;
};

const itemToAdd = {
  id: 100,
}

addToObj(itemToAdd, 2.1, myObj);


推荐阅读