[英]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]
。 如果key
是value
添加到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.