【问题标题】:Map nested object to array将嵌套对象映射到数组
【发布时间】:2021-03-31 18:17:53
【问题描述】:

我整天都在用头撞墙试图解决这个问题,也在这里搜索过,我还没有找到任何东西。

我从 API 返回的当前对象的结构是这样的,每个设备都有超过 2000 个数据点:

{ "DeviceA": [

     {  "device_id": "DeviceA",
        "time": "2021-01-23T18:43:14Z",
        "temperature": 1.875,
        "strength": -14.827574,
        "maturity": 105.904513
     },
     {  "device_id": "ExampleB",
        "time": "2021-01-23T18:53:14Z",
        "temperature": 1.35,
        "strength": -145.64274540827574,
        "maturity": 10.904513
     },
             ]

 "DeviceB": [
     {  "device_id": "DeviceB",
        "time": "2021-01-23T18:43:14Z",
        "temperature": 1.5,
        "strength": -120.64274540827574,
        "maturity": 3233.04513
     },
     {  "device_id": "ExampleB",
        "time": "2021-01-23T18:53:14Z",
        "temperature": 1.875,
        "strength": -17.4274540827574,
        "maturity": 10554.268851904513
     },
}

以及我想要的方式

[
  {
    "id": "DeviceA"
    "Data": [
      {
         "x": "time"
         "y": "temperature"
      }
     ]
  }
  {
    "id": "DeviceB"
    "Data": [
      {
         "x": "time"
         "y": "temperature"
      }
     ]
  }
]

我尝试过嵌套映射数组,数以百万计的东西,但我永远无法获得正确的输出。任何帮助将不胜感激!

编辑:

很抱歉,我没有为我正在做的事情包含一些代码

  const graphAllTempVTime = () => {
const sensorTempVTimeMapped = Object.entries(sensorDatasFromCast).map(
  (items, index) => ({
    id: items[0],
    data: [
      {
        x: items[1].time,
        y: items[1].temperature,
      },
    ],
  })
)

return sensorTempVTimeMapped
}

但是这会产生以下输出:

【问题讨论】:

  • 只要确保我有这个权利。所以你的 API 推出的是一个巨大的对象,而不是一个包含对象的数组?
  • 是的。顶层是一个对象

标签: javascript arrays javascript-objects


【解决方案1】:

您可以使用:Object.keys() - check the docs 它将接受一个对象(如您的第一个示例)并将键作为数组返回,您可以从那里遍历每个键并转换每个值。您也可以查看Object.entries(),它是较新的,因此请注意平台支持。

如果您发布一些您正在尝试的代码可能会有所帮助,也许社区可以找到修复方法

【讨论】:

  • 抱歉代码不足,我已经添加了,感谢您的建议
  • 别担心。我看到有人已经在尝试帮助你,我的下一个建议是你自己解决这个问题。一旦你做对了,这是一件很简单的事情,看到其他答案,你可以看到其他人在尝试什么,你可以将它用于你自己的解决方案。在我看来,如果有人给你一个你只复制/粘贴的工作代码,那么你将错过学习机会。
【解决方案2】:

您需要映射每个键的值。

let o = { "DeviceA": [ { "device_id": "DeviceA", "time": "2021-01-23T18:43:14Z", "temperature": 1.875, "strength": -14.827574, "maturity": 105.904513 }, { "device_id": "ExampleB", "time": "2021-01-23T18:53:14Z", "temperature": 1.35, "strength": -145.64274540827574, "maturity": 10.904513 }, ], "DeviceB": [ { "device_id": "DeviceB", "time": "2021-01-23T18:43:14Z", "temperature": 1.5, "strength": -120.64274540827574, "maturity": 3233.04513 }, { "device_id": "ExampleB", "time": "2021-01-23T18:53:14Z", "temperature": 1.875, "strength": -17.4274540827574, "maturity": 10554.268851904513 } ] };
const res = Object.entries(o).map(
  ([key,val], index) => ({
    id: key,
    data: val.map(x=>({x:x.time, y: x.temperature}))
  })
)
console.log(res)

【讨论】:

  • 这非常有效,并且是迄今为止最快的答案!非常感谢!!
  • @AndreaCorrado 很高兴为您提供帮助。
【解决方案3】:

上面已经提到了一些非常简单的入门方法,但是这是 JS 中经典的函数式编程问题。像这样的问题让我的一天变得有趣。

Object.keys(THE_OBEJCT)
  .map(name =>
    THE_OBEJCT[name].map(device => ({
      id: name,
      Data: THE_OBEJCT[name].map(device => ({
        time: device.time,
        temperature: device.temperature
      }))
    }))
  )
  .map(d =>
    d.reduce((memo, d) => ({ id: d.id, data: memo.data.concat(d.Data) }), {
      data: []
    })
  )

非常基本,但会创建一个看起来像这样的对象数组...

【讨论】:

  • 非常感谢。但是我没有得到与你相同的输出,你所拥有的是正确的。这是我得到的输出:imgur.com/JjLT6Yi
  • 您希望 Data 作为数组还是对象?
  • 感觉id需要在第二个map之外,这样就只有一个id,然后下一个数组里面有数据。
  • 这就是它应该的样子,想象一下还有多个其他设备集,因为在图片中的这个例子中只有一个。 imgur.com/u7Y1Vog
  • OK 我已经更新到我认为你想要的。它可能更干净,但是你去......
【解决方案4】:
const newArr = []

Object.keys(myObject).map((key, index) => {
  newArr.push(
  {
    id: key,
    Data: [
      {
        x: myObject[key][0].time,
        y: myObject[key][0].temperature,
      }
    ],
  }
  )
});

可能是这样的。

【讨论】:

  • 谢谢,但我真的不明白这个输出?似乎只输出一个小数组 = [1,2]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-08
  • 2023-01-23
  • 1970-01-01
  • 1970-01-01
  • 2021-09-30
  • 2022-08-10
  • 1970-01-01
相关资源
最近更新 更多