合并在JavaScript中具有相同索引的JSON列表

时间:2019-11-19 17:27:26

标签: javascript json

我有以下json数据:

{
    "leadId": 0,

    "nationalAvg": {
        "2007": 822.0,
        "2008": 830.0,
        "2009": 880.0,
        "2010": 909.0,
        "2011": 979.0,            
    },
    "stateAvg": {
        "2007": 1023.0,
        "2008": 1026.0,
        "2009": 1035.0,
        "2010": 1050.0,
        "2011": 1072.0,
        "2012": 1150.0,
    },
    "zipCodeAvg": {
        "2007": 1050.98,
        "2008": 1054.06,
        "2009": 1063.29,
        "2010": 1078.69,
        "2011": 1101.27,
        "2012": 1181.49,
        "2013": 1297.64,
        "2014": 1349.99,
    }
}

我想将nationalAvg,stateAvg,zipCodeAvg合并在一起,以获得类似以下结果:

["2007":  822.0,      1023.0,   1050.98]
["2008":  830.0,      1026.0,   1054.06]
["2009":  880.0,      1035.0,   1063.29]
["2010":  909.0,      1050.0,   1078.69]
["2011":  null,       1072.0,   1101.27]
["2012":  null,      1150.0,    1181.49]
["2013":  null,      null,      1297.64]
["2014":  null,      null,      1349.99]

我想在Google折线图中显示此数据。

2 个答案:

答案 0 :(得分:1)

您可以执行以下操作:

const data = {
    "leadId": 0,

    "nationalAvg": {
        "2007": 822.0,
        "2008": 830.0,
        "2009": 880.0,
        "2010": 909.0,
        "2011": 979.0,            
    },
    "stateAvg": {
        "2007": 1023.0,
        "2008": 1026.0,
        "2009": 1035.0,
        "2010": 1050.0,
        "2011": 1072.0,
        "2012": 1150.0,
    },
    "zipCodeAvg": {
        "2007": 1050.98,
        "2008": 1054.06,
        "2009": 1063.29,
        "2010": 1078.69,
        "2011": 1101.27,
        "2012": 1181.49,
        "2013": 1297.64,
        "2014": 1349.99,
    }
}

const keys = ['nationalAvg', 'stateAvg', 'zipCodeAvg'];

const years = keys
  .reduce((a, k) => [...a, ...Object.keys(data[k])], [])
  .filter((v, i, arr) => arr.indexOf(v) === i)
  .sort();


const result = years.map((year) => 
  [year, ...keys.reduce((a, k) => [...a, data[k][year]], [])]
);

console.log(result);

这是如何工作的:它首先创建一个所有年份的数组(三个对象的所有键),从该数组中过滤出所有重复项,然后将其映射为从中添加这些年份的值(这些属性)这三个对象。

答案 1 :(得分:1)

    const  list = {
        "leadId": 0,

        "nationalAvg": {
            "2007": 822.0,
            "2008": 830.0,
            "2009": 880.0,
            "2010": 909.0,
            "2011": 979.0,            
        },
        "stateAvg": {
            "2007": 1023.0,
            "2008": 1026.0,
            "2009": 1035.0,
            "2010": 1050.0,
            "2011": 1072.0,
            "2012": 1150.0,
        },
        "zipCodeAvg": {
            "2007": 1050.98,
            "2008": 1054.06,
            "2009": 1063.29,
            "2010": 1078.69,
            "2011": 1101.27,
            "2012": 1181.49,
            "2013": 1297.64,
            "2014": 1349.99,
        }
    }


    let keys = ['nationalAvg', 'stateAvg', 'zipCodeAvg'];

    let obj =keys.reduce((acc, c, i) => {
    	Object.entries(list[c]).map(( o ) => { 
    		acc[o[0]] = (acc[o[0]] || Array.from({length: keys.length}).fill(null));
    		acc[o[0]][i] = (o[1]);
        });
    	return acc;
    }, {});

// Format 1
console.log(obj);

const result = Object.entries(obj).map(o=> [ o[0], ...o[1]]);
//Format 2
console.log(result)