【问题标题】:How do I get array of values from a nested object in Javascript如何从 Javascript 中的嵌套对象中获取值数组
【发布时间】:2021-09-21 20:12:56
【问题描述】:

我正在尝试从表单数据创建记录。当我 console.log(req.body) 我得到以下记录。

req.body => [Object: null prototype] {
  id: '1',
  key1: 'Value1',
  key2: 'Value2',
  supervisors: '[object Object],[object Object],[object Object]'
}

所以我检查了存储记录的数据库,发现主管存储为:

supervisors: Array(3)
  0:
    name: "Reporter"
    userId: 4
  1:
    name: "Officer 1"
    userId: 5
  2:
    name: "Coordinator"
    userId: 2

我想在 req.body 的 supervisors 字段中将 userId 的值作为数组获取,这样我的 req.body 将如下所示:

req.body => [Object: null prototype] {
  id: '1',
  key1: 'Value1',
  key2: 'Value2',
  supervisors: '[4, 5, 2]'
}
  1. 我做了const supervisors = JSON.stringify(req.body.supervisors)),当控制台登录时我得到了[object Object],[object Object],[object Object]

  2. 我输入了const supervisors = q.supervisors ? JSON.parse(q.supervisors) : [];,当控制台登录时我得到了SyntaxError: Unexpected token o in JSON at position 1 at JSON.parse

  3. 我输入了const supervisors = req.body.supervisors.map(sup => sup.userId);,当控制台登录时我得到了req.body.supervisors.map is not a function

我怎样才能将主管的值设为 [2, 4, 5]?

【问题讨论】:

  • const superIds = supervisors.map(s => s.userId);

标签: javascript arrays json multidimensional-array


【解决方案1】:

使用map()

const supervisors = q.supervisors.map(sup => sup.userId);

您不需要使用任何 JSON 函数,因为您显示的数据已经被解析为对象数组。

【讨论】:

  • 谢谢@Barmar 我按照描述使用了它,我得到了错误UnhandledPromiseRejectionWarning: TypeError: q.supervisors.map is not a function
  • 我认为q 是您在问题中显示的对象。如果不是,请将其替换为正确的变量。
  • 在我的情况下,我假设 q 将是 req.body 所以我替换它并仍然收到错误req.body.supervisors.map is not a function
  • 请再看一遍问题,我已经更新了更多细节
  • 客户端未正确发送参数。他们连接了主管对象,将它们转换为字符串[object Object]
【解决方案2】:

如上所述,map() 是正确的单行方法。

如果您需要链接进一步的转换,使用arrow function(具有隐式return)的map() 也是理想的方法。

另类(冗长但又快如闪电)方法是(那个老主力)for loop


工作示例:

// THE OBJECT
const myObject = {

  supervisors: [

    {
      name: 'Reporter',
      userId: 4
    },

    {
      name: 'Officer 1',
      userId: 5
    },

    {
      name: 'Coordinator',
      userId: 2
    }
  ]
};

// THE SUPERVISORS ARRAY (NOT YET POPULATED)
const supervisors = [];

// LOOP THROUGH THE ARRAY IN THE OBJECT TO POPULATE THE SUPERVISORS ARRAY
for (let i = 0; i < myObject.supervisors.length; i++) {

  supervisors.push(myObject.supervisors[i].userId);
  
  console.log(supervisors);
}

【讨论】:

  • 谢谢@Rounin 我收到错误UnhandledPromiseRejectionWarning: ReferenceError: myObject is not defined
  • myObject 是一个示例名称(如foobar) - 在上面的示例中,它是您使用的任何变量名称的替代名称实际使用。
  • 当我这样做时,我得到了一个很长的未定义值。同时我用更多细节更新了问题 supervisors => [ undefined ] supervisors => [ undefined, undefined ] supervisors => [ undefined, undefined, undefined ]
  • 请再看一遍问题,我已经更新了更多细节
  • @Wacademy - 在此页面上,您得到了两个明确的答案,向您展示了如何从一个对象构建一个简单的数组:1) 使用 map() 函数; 2) 使用 for loop 。此时您肯定有足够的能力编写自己的工作代码。这两个答案中是否有任何部分对您没有意义?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-14
  • 2021-11-29
  • 2013-10-11
  • 1970-01-01
  • 1970-01-01
  • 2020-05-10
  • 1970-01-01
相关资源
最近更新 更多