递归遍历嵌套的JS对象以创建字符串

时间:2019-01-15 17:10:33

标签: javascript recursion

我有一个带有多个嵌套对象的对象,它也可以有对象数组。这是一个示例:

{
  "name": "0040",
  "id": "9952",
  "type": 1,
  "items": [
    {
      "code": "AUD",
      "value": 604.84
    },
    {
      "code": "CAD",
      "value": 586.36
    },
    {
      "code": "CHF",
      "value": 441.56
    },
    {
      "code": "EUR",
      "value": 389.87
    },
    {
      "code": "GBP",
      "value": 346.01
    },
    {
      "code": "HKD",
      "value": 345.31
    },
    {
      "code": "JPY",
      "value": 501.67
    },
    {
      "code": "NZD",
      "value": 642.29
    },
    {
      "code": "USD",
      "value": 441.50
    }
  ]
}

我必须遍历整个对象,并创建一个包含属性code的所有值的字符串。我已经编写了一个可解决此问题的递归函数,但使用的是称为codes的全局变量。如何更改该方法以使用局部变量而不是全局变量。

这是我的代码:

getAllCodes(data) {
    for (const key in data) {
      if (data.hasOwnProperty(key)) {
        if (Array.isArray(data[key])) {
          this.getAllCodes(data[key]);
        } else if (typeof data[key] === 'object') {
          if (data[key]['code']) {
            this.codes += `${data[key].code}+`;
          } else {
            this.getAllCodes(data[key]);
          }
        }
      }
    }
  }

2 个答案:

答案 0 :(得分:1)

我在这里看不到需要recursion。您只需使用reduce即可

let obj = {"name": "0040","id": "9952","type": 1,  "items": [{ "code": "AUD","value": 604.84 },{    "code": "CAD","value": 586.36},{"code": "CHF",   "value": 441.56 }, { "code": "EUR", "value": 389.87   }, { "code": "GBP", "value": 346.01 }, { "code": "HKD",    "value": 345.31 }, { "code": "JPY", "value": 501.67   }, {"code": "NZD","value": 642.29 }, {"code": "USD",     "value": 441.50}]}

let codeString = obj.items.reduce((output,{code})=>{
  output += code + ' '
  return output;
},'')

console.log(codeString)

答案 1 :(得分:1)

您可以采用一个函数来从嵌套对象中递归地收集code属性。

const 
    getCode = object => [
        ...['code' in object ? object.code : ''],
        ...Object.values(object).filter(o => o && typeof o === 'object').map(getCode)
    ].join(' ');

var object = { code: 'a', nodes: { code: 'b', nodes: {  code: 'c', nodes: { code: 'd' } } } };

console.log(getCode(object));