Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/473.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 递归列出嵌套对象键_Javascript_Node.js - Fatal编程技术网

Javascript 递归列出嵌套对象键

Javascript 递归列出嵌套对象键,javascript,node.js,Javascript,Node.js,我有一个嵌套对象: options = { religous: { kosher: { value: 'Kosher', chosen: false }, halal: { value: 'Halal', active: false }, }, vegan: { value: 'Vegan', active: false }

我有一个嵌套对象:

  options = {
    religous: {
      kosher: {
        value: 'Kosher',
        chosen: false
      },
      halal: {
        value: 'Halal',
        active: false
      },
    },
    vegan: {
      value: 'Vegan',
      active: false
    }
  }
它包含大小不同的嵌套对象。我想得到一个数组,其中包含任何值属性的值。因此,对于上述对象,所需输出为:

[‘犹太’、‘清真’、‘纯素’]

秩序并不重要。 我试着递归地这样做:

  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:最大调用堆栈大小超过了这个错误

有什么建议吗?

for…in循环分配密钥。要获取值,请使用obj[key]。如果键是value add to lst,如果它是一个对象,则对其调用getListOfLabels,并将结果传播到lst.push:

const options={religours:{kosher:{value:kosher,selected:false},halal:{value:halal,active:false},纯素食者:{value:vegan,active:false} const getListOfLabels=obj=>{ 常数lst=[] 用于输入obj中的let键{ const val=obj[key]//获取值 if key==“value”lst.pushval//如果键名为value push to lst else iftypeof val==='object'lst.push…getListOfLabelsval//如果值的类型是object,则使用getListOfLabels对其进行迭代,并将结果推送到lst } 返回lst } const result=getListOfLabelsoptions
logresult您可以采用递归方法检查对象是否包含值键

函数getValuesobject,键{ 如果输入对象返回[object[key]; 返回Object.valuesobject.reducer,v=>{ 如果v&&typeof v==='object'r.push…getValuesv,键; 返回r; }, []; } var options={religours:{kosher:{value:'kosher',selected:false},halal:{value:'halal',active:false},vegan:{value:'vegan',active:false};
console.loggetValuesoptions“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 ]), [])
  ]), [])