形成新的对象与对象
问题描述:
从加工对象物1的阵列,我试图以形成另一个目的2.我写了这个下面一段代码,但我DONO这是正确的方法来实现目的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"
}
]
}
]
如果有人能帮助我更好approa CH。在我的代码中,我很难编写对象1的关键名称。是否可以用其他方式?
答
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));
答
为了避免硬编码年项,你可以使用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);
答
您可以通过输入数组不在sno
从对象获得的唯一键的名称提取键,然后用减速机来改变数据形式。
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));
一个很好的答案应该包括它是如何回答这个问题,例如解释为什么你认为这比OP更“好”。 – RobG
看起来我误解了这个问题。 – wostex