Javascript:以特定数组格式重新排列json输出

问题描述

对我来说又是愚蠢的时刻。花了几个小时进行循环,映射,归约,词典,但似乎无法弄清楚。我有一个像这样的json数据

{
  "timeline": [
    {
      "series": "series1","data": [
        {
          "date": "20200713T120000Z","value": 0
        },{
          "date": "20200714T120000Z","value": 8
        },{
          "date": "20200715T120000Z","value": 0
        }
      ]
    },{
      "series": "series2",{
      "series": "series3","value": 1
        },{
      "series": "series4","value": 2
        },"value": 4
        }
      ]
    }
  ]
}

我需要这种格式

[
  {
    date: "20200713T120000Z",series1: 0,series2: 0,series3: 1,series4: 2
  },{
    date: "20200714T120000Z",series1: 8,series3: 0,series4: 4
  }
]

需要使用JavaScript进行此操作。任何帮助/指针将不胜感激。

解决方法

这是为此的临时解决方案,您可以尝试一下。我正在使用import * as GoogleSignIn from 'expo-google-sign-in' signInAsync = async () => { try { await GoogleSignIn.askForPlayServicesAsync() const result = await GoogleSignIn.signInAsync() return result } catch ({ message }) { return { type: 'failure',message } } } ,所以请安装它。

lodash
,

使用多个forEach循环并构建一个要跟踪的对象。然后得到Object.values

const convert = (arr) => {
  const res = {};
  arr.forEach(({ series,data }) =>
    data.forEach(
      ({ date,value }) =>
        (res[date] = { ...(res[date] ?? { date }),[series]: value })
    )
  );
  return Object.values(res);
};

obj = {"timeline": [ { "series": "series1","data": [ { "date": "20200713T120000Z","value": 0 },{ "date": "20200714T120000Z","value": 8 },{ "date": "20200715T120000Z","value": 0 }] },{ "series": "series2",{ "series": "series3","value": 1 },{ "series": "series4","value": 2 },"value": 4 }] }] }

const res = convert(obj.timeline);
console.log(res)

,

您可以使用一个对象进行分组,并使用一个数组来存储所有键,以便使用所有相同的键获得有序的结果。

这种方法从结果集中过滤掉所有零值。

const
    data = { timeline: [{ series: "series1",data: [{ date: "20200713T120000Z",value: 0 },{ date: "20200714T120000Z",value: 8 },{ date: "20200715T120000Z",value: 0 }] },{ series: "series2",{ series: "series3",value: 1 },{ series: "series4",value: 2 },value: 4 }] }] },keys = ['date'],result = Object
        .values(data.timeline.reduce((r,{ series,data }) => {
            keys.push(series);
            data.forEach(({ date,value }) => {
                if (!value) return;
                if (!r[date]) r[date] = { date };
                r[date][series] = value;
            });
            return r;
        },{}))
        .map(o => ({ ...Object.fromEntries(keys.map(k => [k,0])),...o }));

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }