从对象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的密钥名称进行编码。是否可以采用其他方式?
答案 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));