鍍金池/ 問答/C++  HTML/ 求教一個js遞歸函數(shù)的寫法

求教一個js遞歸函數(shù)的寫法

工作中一個遞歸寫不出,求高手幫忙,采納有打賞,謝謝,Thanks?(?ω?)?
有如下一段數(shù)據(jù)

[{
  id: '1',
  name: '姓名1',
  items: [
    {
      id: '2',
      name: '姓名2',
      items: [
        {
          id: '3',
          name: '姓名3',
          items: [
            {
              id: '4',
              name: '姓名4',
            },
          ],
        },
      ],
    },
    {
      id: '5',
      name: '姓名5',
    },
    {
      id: '6',
      name: '姓名6',
    },
  ],
},
{
  id: '7',
  name: '姓名7',
}];

要求有一個函數(shù),傳入一個id值,從數(shù)據(jù)中找到id為傳入id的對象,以及這個對象的所有父級對象

比如,傳入id為'5',返回

[{id: '5', name: '姓名5'}, {id: '1', name: '姓名1'}]

傳入id為'3',返回

[{id: '3', name: '姓名3'}, {id: '2', name: '姓名2'}, {id: '1', name: '姓名1'}]

謝謝大家?guī)椭鷡~~

回答
編輯回答
執(zhí)念
let root = [{
  id: '1',
  name: '姓名1',
  items: [
    {
      id: '2',
      name: '姓名2',
      items: [
        {
          id: '3',
          name: '姓名3',
          items: [
            {
              id: '4',
              name: '姓名4',
            },
          ],
        },
      ],
    },
    {
      id: '5',
      name: '姓名5',
    },
    {
      id: '6',
      name: '姓名6',
    },
  ],
}];

function search(root, id) {
  for (let i = 0; i < root.length; i += 1) {
    if (root[i].id === id) {
      return [{ id, name: root[i].name }];
    }
  }
  for (let i = 0; i < root.length; i += 1) {
    if (root[i].items && Array.isArray(root[i].items)) {
      const res = search(root[i].items, id);
      if (res.length) return [...res, { id: root[i].id, name: root[i].name }];
    }
  }
}

console.log(search(root, '5'));
console.log(search(root, '3'));
2017年11月12日 15:25
編輯回答
笨小蛋
let root = {
  id: '1',
  name: '姓名1',
  items: [
    {
      id: '2',
      name: '姓名2',
      items: [
        {
          id: '3',
          name: '姓名3',
          items: [
            {
              id: '4',
              name: '姓名4',
            },
          ],
        },
      ],
    },
    {
      id: '5',
      name: '姓名5',
    },
    {
      id: '6',
      name: '姓名6',
    },
  ],
};

function search(root, id) {
  if(root.id == id) return [ { id: id, name: root.name} ];
  else {
    for(let item of (root.items || [])) {
      let res = search(item, id);
      if(res.length) return [ ...res, { id: root.id, name: root.name } ];
    }
    return [];
  }
}

console.log(search(root, '5'));
console.log(search(root, '3'));

思路和“使用遞歸實現(xiàn)逆序打印用戶輸入的字符串”類似,每一層遞歸返回該層搜索到的路徑,空數(shù)組代表搜索失?。划斣搶舆f歸得到下層遞歸返回的結(jié)果后,就把當前節(jié)點加入路徑中,然后向上層返回。

如果需要搜索的樹特別大的話最好是優(yōu)化一下返回的方式,我這種寫法每次都會生成一個新的數(shù)組對象,你可以用Array.push把同一個路徑傳遞下去。

2017年2月9日 00:27