用对象数组形成新对象

时间:2017-04-01 22:06:38

标签: javascript json

从对象1开始,我试图形成另一个对象2.我在下面写了一段代码,但我不认为这是实现对象2的正确方法。

var arr = [];
    object1.filter(function(value) {
                                return value.hasOwnProperty("This Year"); // Get only elements, which have such a key
                                    }).map(function(value) {
                                arr.push({value:value["This Year"]}); // Extract the values only
                                    });

对象1

var obj=[
  {
    "sno": 1,
    "Last Year": 10000
  },
  {
    "sno": 2,
    "Last Year": 11500
  },
  {
    "sno": 3,
    "Last Year": 12500
  },
  {
    "sno": 4,
    "This Year": 25400
  },
  {
    "sno": 5,
    "Last Year": 15000
  },
  {
    "sno": 6,
    "This Year": 29800
  }
]

对象2 - 期望的结果

var dataset = [
        {
            "seriesname": "Last Year",
            "data": [
                {
                    "value": "10000"
                },
                {
                    "value": "11500"
                },
                {
                    "value": "12500"
                },
                {
                    "value": "15000"
                }
            ]
        },
        {
            "seriesname": "This Year",
            "data": [
                {
                    "value": "25400"
                },
                {
                    "value": "29800"
                }
            ]
        }
    ]

如果有人能用更好的方法帮助我。在我的代码中,我很难对对象1的密钥名称进行编码。是否可以采用其他方式?

3 个答案:

答案 0 :(得分:2)

var obj1 = [
  {
    "sno": 1,
    "Last Year": 10000
  },
  {
    "sno": 2,
    "Last Year": 11500
  },
  {
    "sno": 3,
    "Last Year": 12500
  },
  {
    "sno": 4,
    "This Year": 25400
  },
  {
    "sno": 5,
    "Last Year": 15000
  },
  {
    "sno": 6,
    "This Year": 29800
  }
];

var dataset = [];

["This Year", "Last Year"].forEach((series) => {
    dataset.push({
        seriesname: series,
        data: obj1.filter((el) => {
                return el[series];
            }).map((el) => {
                return {
                    value: el[series]
                }
            })
        });
});

console.log(JSON.stringify(dataset, null, 2));

答案 1 :(得分:1)

为避免对条目进行硬编码,您可以使用RegExp查找包含year字词的密钥。



var arr = [{sno:1,"Last Year":1e4},{sno:2,"Last Year":11500},{sno:3,"Last Year":12500},{sno:4,"This Year":25400},{sno:5,"Last Year":15e3},{sno:6,"This Year":29800}],
    res = [...new Set(arr.map(v => Object.keys(v).find(z => /year/i.test(z))))]
          .map(c => ({seriesname: c, data: arr.filter(x => x[c]).map(a => ({value: a[c]}))}));
  
console.log(res);




答案 2 :(得分:0)

您可以通过从输入数组中的对象获取非sno的对象中的唯一键名来提取键,然后使用reducer更改数据表单。

var obj = [
  {
    "sno": 1,
    "Last Year": 10000
  },
  {
    "sno": 2,
    "Last Year": 11500
  },
  {
    "sno": 3,
    "Last Year": 12500
  },
  {
    "sno": 4,
    "This Year": 25400
  },
  {
    "sno": 5,
    "Last Year": 15000
  },
  {
    "sno": 6,
    "This Year": 29800
  }
]

const getSeries = obj => {
    const emptyResult = getSeriesNames(obj).map(seriesName => ({
      seriesName,
      data: []
    }));
    
    return obj.reduce((result, item) => {
        const series = result.filter(series => series.seriesName in item)[0]
        series.data.push({ value: item[series.seriesName] });
        return result;
    }, emptyResult);
}

const getSeriesNames = obj => obj.reduce((names, item) => {
    Object.keys(item)
    .filter(key => key !== 'sno')
    .forEach(key => {
        if (!names.includes(key)) {
            names.push(key);
        }
    });
    return names;
}, []); 

console.log(getSeries(obj));

相关问题