从嵌套对象数组中递归创建字符串?

时间:2018-09-03 02:41:15

标签: javascript arrays recursion iteration

最终,我不确定这是否是正确的解决方法,因此我愿意提出建议。

我要做的是编写一个递归函数,该函数在迭代对象数组的每个元素时被调用。该函数应采用array元素,并对其值和嵌套对象进行递归迭代。

例如,在迭代array这样的嵌套对象时,可能会调用该函数……

arrayOfNestedObjects.map(el => objectValues(el))

我正在使用https://jsonplaceholder.typicode.com/来获取这种形状的对象数组...

{
  id: 10,
  name: 'Clementina DuBuque',
  username: 'Moriah.Stanton',
  email: 'Rey.Padberg@karina.biz',
  address: {
    street: 'Kattie Turnpike',
    suite: 'Suite 198',
    city: 'Lebsackbury',
    zipcode: '31428-2261',
    geo: {
      lat: '-38.2386',
      lng: '57.2232'
    }
  },
  phone: '024-648-3804',
  website: 'ambrose.net',
  company: {
    name: 'Hoeger LLC',
    catchPhrase: 'Centralized empowering task-force',
    bs: 'target end-to-end models'
  }
}

我想从递归函数中返回的是一个数组的每个元素的一个 all 值的连接字符串,包括来自任何嵌套对象的所有值,就像上面的例子一样。

"10clementinadubuquemoriah.stantonrey.padberg@karina.bizkattieturnpikesuite198lebsackbury31428-2261-38.238657.2232024-648-3804ambrose.nethoegerllccentralizedempoweringtask-forcetargetend-to-endmodels"

我遇到的问题是,似乎对我的递归函数进行了最后一次调用,该函数返回一个字符串,忽略了某些嵌套对象中的所有值。到目前为止,这是我要执行的功能...

function objectValues(value, ...args) {
  let string = args;
  Object.values(value).forEach((val, i) => {
    if (typeof val === 'object' && val !== null) {
      objectValues(val, string);
    } else {
      string += val
        .toString()
        .replace(/\s/g, '')
        .toLowerCase();
        console.log(string);
    }
  });
  return string;
}

string子句中记录else会显示我想要的字符串,但是在string上方记录return会显示错误的字符串,缺少字符串company个对象。关于设置递归的过程,一定缺少一些简单的东西。感谢您的任何建议!

1 个答案:

答案 0 :(得分:3)

...args参数使事情变得复杂。如果...args是一个 array ,则将其重命名为let string = args会很混乱-尤其是,正如您稍后会看到的那样,当您执行string += ...时(但是{{1} }在数组

上没有多大意义

相反,只需在函数的开头声明一个空字符串,在必要时将其连接,然后在函数的末尾+=处将其连接。将数组压缩为单个值(例如字符串)时,returnreduce更合适:

forEach

另一种选择是利用const value={id:10,name:'Clementina DuBuque',username:'Moriah.Stanton',email:'Rey.Padberg@karina.biz',address:{street:'Kattie Turnpike',suite:'Suite 198',city:'Lebsackbury',zipcode:'31428-2261',geo:{lat:'-38.2386',lng:'57.2232'}},phone:'024-648-3804',website:'ambrose.net',company:{name:'Hoeger LLC',catchPhrase:'Centralized empowering task-force',bs:'target end-to-end models'}} function objectValues(value) { return Object.values(value).reduce((string, val, i) => string + ( (typeof val === 'object' && val !== null) ? objectValues(val) : val .toString() .replace(/\s/g, '') .toLowerCase() )); } console.log(objectValues(value));的自然递归性质:

JSON.stringify