【问题标题】:Recursively create string out of array of nested objects?从嵌套对象数组中递归创建字符串?
【发布时间】:2019-02-08 02:08:03
【问题描述】:

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

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

因此,例如,在迭代 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;
}

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

【问题讨论】:

    标签: javascript arrays recursion iteration


    【解决方案1】:

    ...args 参数使事情变得比实际情况更复杂。如果...args 是一个数组,那么将其重命名为let string = args 会非常令人困惑——尤其是,正如您稍后会看到的,当您使用string += ... 时(但+=数组)

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

    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 的自然递归性质:

    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));

    【讨论】:

    • string += objectValues(val, string); 应该只是 string += objectValues(val); 对吧?
    • 哦,是的,不再需要那个参数了
    • 哦,对不起!我附上了错误的console.log() 声明。我绝对希望 all 值来自外部对象和任何嵌套对象。对于...args,我试图将string 传递回函数,而不是任何数组。该函数将在数组迭代方法中调用。感谢您的帮助!
    • @joehodd - 无需将累加器字符串传递回函数即可实现您在问题中要求的内容。您可能应该保持这个函数干净并在数组迭代器中进行连接。
    • @JasonB 对不起!为了准确性和清晰度,我编辑了我的问题。谢谢你的建议。希望这对其他人有帮助。
    猜你喜欢
    • 2019-04-02
    • 1970-01-01
    • 2021-08-22
    • 2015-04-11
    • 1970-01-01
    • 2021-03-04
    • 1970-01-01
    • 1970-01-01
    • 2017-07-07
    相关资源
    最近更新 更多