[软件设计/软件工程] 在 JavaScript 中解析 JSON 对象数组

[复制链接]
发表于 2022-5-5 09:18:49
问题
我有一个 JSON 字符串:
  1. {
  2.     "country": "Mauritius",
  3.     "provinces": [
  4.         "mainland"
  5.     ],
  6.     "timeline": {
  7.         "cases": {
  8.             "3/19/20": 3,
  9.             "3/20/20": 12,
  10.             "3/21/20": 14,
  11.             "3/22/20": 28,
  12.             [...]
  13.             "4/17/20": 324
  14.         },
  15.         "deaths": {
  16.             "3/19/20": 0,
  17.             "3/20/20": 0,
  18.             "3/21/20": 1,
  19.             "3/22/20": 2,
  20.             [...]
  21.             "4/17/20": 9
  22.         },
  23.         "recovered": {
  24.             "3/19/20": 0,
  25.             "3/20/20": 0,
  26.             "3/21/20": 0,
  27.             "3/22/20": 0,
  28.             [...]
  29.             "4/17/20": 108
  30.         }
  31.     }
  32. }
复制代码

我试图实现的是解决案例、死亡并将值恢复到 JavaScript 中的单独数组中。

比如病例数,我想求病例数和上一个日期的差,起始日期为 3/19/20,初始病例数为 3。我想应用相同的逻辑到死亡和康复。所以 3/20/20 的值应该是 9 (12-3)

最后,我想将这些数据存储在一个数组中,以便在图表上使用它。有人可以帮我用 JavaScript 或 JQuery 解析这些数据吗?
  1. $.getJSON('https://corona.lmao.ninja/v2/historical/mauritius?lastdays=30', function(data) {

  2.   let result = data.map(function(e) {
  3.     return {
  4.       cases: e.timeline.cases,
  5.       deaths: e.timeline.deaths,
  6.       recovered: e.timeline.recovered
  7.     };
  8.   }).reduce(function(acc, e) {

  9.     Object.keys(e).forEach(function(t) {
  10.       Object.keys(e[t]).forEach(function(d) {
  11.         acc[t][d] = (acc[t][d] || 0) - e[t][d];
  12.       });
  13.     });
  14.     return acc;
  15.   }, {
  16.     deaths: {},
  17.     recovered: {},
  18.     cases: {}
  19.   });
  20.   console.log(result)
  21. });
复制代码
  1. <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

复制代码

回答
下面使用reduce将服务器返回的对象转换为天差。
  1. const entries = Object.entries
  2. const fromEntries = Object.fromEntries
  3. const log = console.log
  4. const URL = "https://corona.lmao.ninja/v2/historical/mauritius?lastdays=30"
  5. async function go() {  
  6.   const { timeline: { cases, deaths } } = await (await fetch(URL)).json()
  7.   const newCases = fromEntries(nonZero(deltas(entries(cases))))
  8.   const newDeaths = fromEntries(nonZero(deltas(entries(deaths))))
  9.   log(`New cases: ${JSON.stringify(newCases, null, 2)}`)
  10.   log(`New deaths: ${JSON.stringify(newDeaths, null, 2)}`)
  11. }
  12. function nonZero(arr) {
  13.   return arr.filter(([_,v]) => v > 0)
  14. }
  15. function deltas(arr) {
  16.   let prev = 0
  17.   return arr.reduce((acc, [date, curr]) => {
  18.     acc.push([date, curr - prev])
  19.     prev = curr
  20.     return acc
  21.   }, [])
  22. }
  23. go()
复制代码






上一篇:将数据帧写入 Postgres 数据库 psycop2
下一篇:在android中合并两个png文件

使用道具 举报

Archiver|手机版|小黑屋|吾爱开源 |网站地图

Copyright 2011 - 2012 Lnqq.NET.All Rights Reserved( ICP备案粤ICP备14042591号-1粤ICP14042591号 )

关于本站 - 版权申明 - 侵删联系 - Ln Studio! - 广告联系

本站资源来自互联网,仅供用户测试使用,相关版权归原作者所有

快速回复 返回顶部 返回列表