在深层嵌套对象中按特定键查找所有值

新手上路,请多包涵

我如何通过深层嵌套对象中的特定键找到所有值?

例如,如果我有这样一个对象:

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

我如何通过 id 的键在这个 obj 的所有嵌套中获得所有值的数组。

注意: children 是一致的名称,并且 id 不会存在于 children 对象之外。

所以从 obj 中,我想生成一个这样的数组:

 const idArray = [1, 2, 3, 4, 5, 6, 7]

原文由 cup_of 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 364
2 个回答

你可以像这样创建一个递归函数:

 idArray = []

function func(obj) {
  idArray.push(obj.id)
  if (!obj.children) {
    return
  }

  obj.children.forEach(child => func(child))
}

您的样本片段:

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

idArray = []

function func(obj) {
  idArray.push(obj.id)
  if (!obj.children) {
    return
  }

  obj.children.forEach(child => func(child))
}

func(myObj)
console.log(idArray)

原文由 zmag 发布,翻译遵循 CC BY-SA 4.0 许可协议

这有点晚了,但对于其他发现这一点的人来说,这是一个干净的通用递归函数:

 function findAllByKey(obj, keyToFind) {
  return Object.entries(obj)
    .reduce((acc, [key, value]) => (key === keyToFind)
      ? acc.concat(value)
      : (typeof value === 'object')
      ? acc.concat(findAllByKey(value, keyToFind))
      : acc
    , [])
}

// USAGE
findAllByKey(myObj, 'id')

原文由 Steve Holgado 发布,翻译遵循 CC BY-SA 4.0 许可协议

推荐问题