繁体   English   中英

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

[英]Javascript: rearrage json output in a specific array format

对我来说又是一个愚蠢的时刻。 花了几个小时浏览 for 循环、映射、reduce、字典,但似乎无法弄清楚。 我有一个看起来像这样的 json 数据

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

我需要这种格式

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

需要在 JavaScript 中执行此操作。 任何帮助/指针将不胜感激。

这是临时解决方案,你可以试试这个。 我正在使用lodash ,所以请安装它。

var _ = require('lodash')

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

const t = _.flattenDeep(data.timeline.map(i => i.data.map(d => ({...d, series: i.series}))))

const result = t.reduce((acc, i) => {
    const index = acc.findIndex(a => a.date === i.date)
    if(index !== -1){
        acc[index] = {
            ...acc[index],
            [i.series]: i.value
        }

        
    }else {
        acc.push({
            date: i.date,
            [i.series]: i.value
        })
    }

    return acc
}, [])

console.log(result)

使用多个forEach循环并构建一个 object 进行跟踪。 然后得到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", "data": [ { "date": "20200713T120000Z", "value": 0 },{ "date": "20200714T120000Z", "value": 0 }] },{ "series": "series3", "data": [ { "date": "20200713T120000Z", "value": 1 },{ "date": "20200714T120000Z", "value": 0 }] },{ "series": "series4", "data": [ { "date": "20200713T120000Z", "value": 2 },{ "date": "20200714T120000Z", "value": 4 }] }] } const res = convert(obj.timeline); console.log(res)

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

此方法从结果集中过滤所有零值。

 const data = { timeline: [{ series: "series1", data: [{ date: "20200713T120000Z", value: 0 }, { date: "20200714T120000Z", value: 8 }, { date: "20200715T120000Z", value: 0 }] }, { series: "series2", data: [{ date: "20200713T120000Z", value: 0 }, { date: "20200714T120000Z", value: 0 }] }, { series: "series3", data: [{ date: "20200713T120000Z", value: 1 }, { date: "20200714T120000Z", value: 0 }] }, { series: "series4", data: [{ date: "20200713T120000Z", value: 2 }, { date: "20200714T120000Z", 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; }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM