首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >递归地从嵌套对象数组中创建字符串?

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

Stack Overflow用户
提问于 2018-09-03 02:41:14
回答 1查看 410关注 0票数 0

最终,我不确定这是否是正确的方法,所以我愿意接受建议。

我要做的是编写一个递归函数,这个函数是在迭代对象数组的每个元素时调用的。函数应该接受数组元素,递归地迭代它的值和嵌套对象。

因此,例如,在迭代嵌套对象的array时,可能会调用该函数。

代码语言:javascript
运行
复制
arrayOfNestedObjects.map(el => objectValues(el))

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

代码语言:javascript
运行
复制
{
  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'
  }
}

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

代码语言:javascript
运行
复制
"10clementinadubuquemoriah.stantonrey.padberg@karina.bizkattieturnpikesuite198lebsackbury31428-2261-38.238657.2232024-648-3804ambrose.nethoegerllccentralizedempoweringtask-forcetargetend-to-endmodels"

我遇到的问题是,我的递归函数似乎有一个最后的调用,它返回一个字符串,省略了一些嵌套对象的所有值。到目前为止我的职能是这样的..。

代码语言:javascript
运行
复制
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子句中的日志记录string显示了我想要的字符串,但是在return上面的日志记录string显示了丢失company对象中的值的错误字符串。对于如何设置递归,我肯定错过了一些简单的东西。谢谢你的建议!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-03 02:49:16

...args参数使事情变得更加复杂。如果...args是一个数组,那么将它重命名为let string = args是非常令人困惑的--特别是,当您执行string += ...时(但是+=对数组没有多大意义)。

相反,只需在函数的开头声明一个空字符串,必要时将其连接起来,并在函数的末尾进行return。当您将数组压缩为单个值(例如字符串)时,reduceforEach更合适:

代码语言:javascript
运行
复制
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的自然递归特性:

代码语言:javascript
运行
复制
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) {
  let string = '';
  JSON.stringify(value, (_, val) => {
    if (typeof val === 'string') string += val.replace(/\s/g, '').toLowerCase();
    return val;
  });
  return string;
}

console.log(objectValues(value));

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52142603

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档