嵌套对象返回未定义的递归函数

时间:2019-03-17 07:29:37

标签: javascript

我正在遍历对象的嵌套对象,寻找一个特定的对象,如果找到了,我就会做。我可以使它在第一个嵌套中起作用,但是在此之后的任何嵌套中,我都得到一个未定义的值。

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

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

有人可以帮忙吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

您需要使用递归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);

答案 1 :(得分:1)

代码中有两个问题

  • 如果(obj.id === id)false,那么在循环中您什么也不返回。
  • 您应在循环之前检查obj.children是否存在。

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

There are two problems in code:

 - List item

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;
    }
    if(obj.children){
    
    for (let i=0;i<obj.children.length;i++) {
       let x = search(obj.children[i], id);
       if(x) return x;
      }
    }
  }

  return obj;
};

const itemToAdd = {
	id: 100,
}

addToObj(itemToAdd, 2.1, myObj);

相关问题