繁体   English   中英

递归列出嵌套对象键

[英]Recursively list nested object keys

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

  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错误。

有什么建议?

for...in循环分配key 要获取值,请使用obj[key] 如果keyvalue添加到lst ,如果它是一个对象,则调用getListOfLabels ,并将结果传播到lst.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)

您可以采用递归方法并检查对象是否包含value键。

 function getValues(object, key) { if (key in object) return [object[key]]; return Object.values(object).reduce((r, v) => { if (v && typeof v === 'object') r.push(...getValues(v, key)); return r; }, []); } var options = { religous: { kosher: { value: 'Kosher', chosen: false }, halal: { value: 'Halal', active: false } }, vegan: { value: 'Vegan', active: false } }; console.log(getValues(options, 'value'));

这是使用 reduce 的简洁方法:-D

const getValues = options => Object.values(options)
  .reduce((acc, optionObj) => (
    optionObj.value ? [ ...acc, optionObj.value ] : [
    ...acc,
    ...Object.values(optionObj).reduce((arr, { value }) => ([ ...arr, value ]), [])
  ]), [])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM