首页 > 解决方案 > 递归列出嵌套对象键

问题描述

我有一个这样的嵌套对象:

  options = {
    religous: {
      kosher: {
        value: 'Kosher',
        chosen: false
      },
      halal: {
        value: 'Halal',
        active: false
      },
    },
    vegan: {
      value: 'Vegan',
      active: false
    }
  }

它包含不同大小的嵌套对象。我想获得一个包含任何属性值的数组value。因此,对于上述对象,所需的输出将是:

['Kosher', 'Halal', 'Vegan']

顺序并不重要。我试图这样做递归:

  getListOfLabels = obj => {
    const lst = []
    for (let key in obj) {
      if (obj[key].value) lst.push(obj[key].value)
      else return getListOfLabels(obj[key])
    }
    return lst
  }

但我不断收到RangeError: Maximum call stack size exceeded错误。

有什么建议么?

标签: javascriptnode.js

解决方案


for...in循环key分配. 获得使用价值obj[key]。如果添加到,如果它key是一个对象,则调用它,并将结果传播到:valuelstgetListOfLabelslst.push()

const options = {"religous":{"kosher":{"value":"Kosher","chosen":false},"halal":{"value":"Halal","active":false}},"vegan":{"value":"Vegan","active":false}}


const getListOfLabels = obj => {
  const lst = []
  
  for (let key in obj) {
    const val = obj[key] // get the value
    if (key === 'value') lst.push(val) // if the key name is "value" push to lst
    else if(typeof val === 'object') lst.push(...getListOfLabels(val)) // if type of value is object, iterate it with getListOfLabels and push the results into lst
  }
  
  return lst
}

const result = getListOfLabels(options)

console.log(result)


推荐阅读