将一个数据结构转换为另一个数据结构

时间:2017-10-20 16:07:05

标签: javascript

您好我需要解析一些结构以在折线图中显示一些数据。我有这个数据结构,我需要将其转换为数组example_output:

data = {
    "el1": [{
        "date": "2017.01",
        "data1": {
            "series_1": {
                "a": 10,
                "b": 20,
                "c": 50,
                "d": 15,
                "e": 8
            },
            "Series_2": {
                "yes": 5,
                "no": 3
            },
            "Series_3": {
                "s": 2,
                "n": 9
            }
        },
        "text": [{
            "t": "header",
            "c": "text"
        }, {
            "t": "header2",
            "c": "text2"
        }]
    }, {
        "date": "2017.02",
        "data1": {
            "series_1": {
                "a": 56,
                "b": 23,
                "c": 45,
                "d": 69,
                "e": 14
            },
            "Series_2": {
                "yes": 2,
                "no": 1
            },
            "Series_3": {
                "s": 6,
                "n": 4
            }
        },
        "text": [{
            "t": "header",
            "c": "text"
        }, {
            "t": "header2",
            "c": "text2"
        }]
    }, {
        "date": "2017.03",
        "data1": {
            "series_1": {
                "a": 15,
                "b": 12,
                "c": 10,
                "d": 54,
                "e": 4
            },
            "Series_2": {
                "yes": 20,
                "no": 16
            },
            "Series_3": {
                "s": 9,
                "n": 7
            }
        },
        "text": [{
            "t": "header",
            "c": "text"
        }, {
            "t": "header2",
            "c": "text2"
        }]
    }
    ]
};

我需要这样的OUTPUT for chartist.js

var example_output = [{
labels: ['2017.01', '2017.02', '2017.03'],
series: {
    [10, 56, 15],
    [20, 23, 12],
    [50, 45, 10],
    [15, 69, 54],
    [8, 14, 4]
},
labels: ['2017.01', '2017.02', '2017.03'],
series: {
    [5, 2, 20],
    [3, 1, 16]
},
labels: ['2017.01', '2017.02', '2017.03'],
series: {
    [2, 6, 9],
    [9, 4, 7]
},}] ; 

请比较原始数字和example_output中的数字,以便更好地了解它的外观。我使用代码来解析这个但是出错了:

function parseData(data) {
  var _newData = {};
  var allSeries = [];
  data.elements.forEach(function(el){
    _newData[el.date] = el.info
    if(allSeries.length==0)
      allSeries = Object.keys(el.info);
  });

  return allSeries.map(function(el) {
    var obj = {
      labels: [],
      series: []
    };
    obj.labels = Object.keys(_newData);
    Object.keys(_newData).forEach(function(_el) {
      obj.series.push(Object.values(_newData[_el][el]));
    });
    var _newSeries = [];
    obj.series[0].forEach(function(el, i){
      _newSeries.push([el, obj.series[1][i]]);
    });
    obj.series = _newSeries;
    return obj;
  });
}

1 个答案:

答案 0 :(得分:0)

您可以使用array#forEacharray#reduce。使用第一个循环迭代el1,然后对series键使用reduce,并将结果累加到output_example

注意:输出中的series不正确。它应该是一个数组而不是对象。



const data = {"el1": [{"date": "2017.01","data1": {"series_1": {"a": 10,"b": 20,"c": 50,"d": 15,"e": 8},"Series_2": {"yes": 5,"no": 3},"Series_3": {"s": 2,"n": 9}},"text": [{"t": "header","c": "text"}, {"t": "header2","c": "text2"}]}, {"date": "2017.02","data1": {"series_1": {"a": 56,"b": 23,"c": 45,"d": 69,"e": 14},"Series_2": {"yes": 2,"no": 1},"Series_3": { "s": 6,"n": 4 }},"text": [{"t": "header","c": "text"}, {"t": "header2","c": "text2"}]}, {"date": "2017.03","data1": {"series_1": {"a": 15,"b": 12,"c": 10,"d": 54,"e": 4},"Series_2": {"yes": 20, "no": 16},"Series_3": {"s": 9, "n": 7}},"text": [{"t": "header","c": "text"}, {"t": "header2","c": "text2" }]}]};
      transpose = (arr) => arr.reduce((r,v,i) => {
        (r[i] = r[i] || []).push(v);
        return r;
      },[]);

let example_output = [];

data.el1.forEach((o) => {
  
  Object.keys(o.data1).reduce((r, k, i) => {
    r[i] = r[i] || {};

    if('labels' in r[i])
      r[i]['labels'].push(o.date);
    else
      r[i]['labels'] = [o.date];

    if('series' in r[i])
      Object.values(o.data1[k]).forEach((v,j) => r[i]['series'][j].push(v));
    else
      r[i]['series'] = transpose(Object.values(o.data1[k]));
    
    return r;
  },example_output);
  
},[]);

console.log(example_output);

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