简体   繁体   English

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

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

Another dumb moment for me.对我来说又是一个愚蠢的时刻。 Spent hours through for loops, maps, reduce, dictionaries but just can't seem to figure it out.花了几个小时浏览 for 循环、映射、reduce、字典,但似乎无法弄清楚。 I have a json data that look like this我有一个看起来像这样的 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
        }
      ]
    }
  ]
}

I need it in this format我需要这种格式

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

Need to do this in JavaScript.需要在 JavaScript 中执行此操作。 Any help/ pointers will be much appreciated.任何帮助/指针将不胜感激。

This is temporary solution for this, you can try this.这是临时解决方案,你可以试试这个。 I'm using lodash , so please install it.我正在使用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)

Use multiple forEach loops and build an object to track.使用多个forEach循环并构建一个 object 进行跟踪。 Then get Object.values然后得到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)

You could take an object forgrouping and an array for storing all keys for getting an ordered result with all same keys.您可以使用 object 进行分组,并使用一个数组来存储所有键,以获得具有所有相同键的有序结果。

This approach filters all zero values from the result set.此方法从结果集中过滤所有零值。

 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