我有一个对象数组,它们共享公共属性名称,但具有不同的值。例如,它们是这样的:
let data = [
{
value1: "11:00",
value2: 0.737462,
value3: 1.345341,
value4: 0.684655
},
{
value1: "12:00",
value2: 0.894368,
value3: 1.55891,
value4: 0.784655
},
{
value1: "13:00",
value2: 1.140516,
value3: 1.938695,
value4: 0.454655
}
]
从这些对象中,我需要形成一个新的对象数组,类似于:
let datasets = [
{
label: "value1",
data: ["11:00", "12:00", "13:00"]
},
{
label: "value2",
data: [0.737462,0.894368,1.140516,]
}
// and so on
]
因此,我的数据集中的每个对象都将包含原始对象的属性名称作为label
的值以及与该名称对应的属性数组。我试过这样做:
let datasets = data.map((n) => {
for (i in n) {
return {
label: i,
data: data.map(obj => obj[i])
}
}
});
但它并没有按预期工作 - 它只返回一个对象数组,只有第一个属性名称作为标签。我想这是因为它会在for...in
循环中的第一个项目后立即返回,但我无法找到更好的方法来实现我的需求。
答案 0 :(得分:3)
预期数组中的元素数等于数组元素中的键数,因此映射到该数组,然后运行另一个简单的映射来生成数据数组。
var z = myInput.value.split('\n');
z = z.sort();
myOuput.value = z.join('\n');
答案 1 :(得分:2)
您可以使用reduce()
和ES6 Map
执行此操作。
let data = [{"value1":"11:00","value2":0.737462,"value3":1.345341,"value4":0.684655},{"value1":"12:00","value2":0.894368,"value3":1.55891,"value4":0.784655},{"value1":"13:00","value2":1.140516,"value3":1.938695,"value4":0.454655}]
var result = [...data.reduce(function(r, e) {
return Object.keys(e).forEach(k => {
if(!r.has(k)) r.set(k, {label: k, data: [e[k]]})
else r.get(k).data.push(e[k])
}), r
}, new Map).values()]
console.log(result)

答案 2 :(得分:0)
const datasets = data.reduce((acc, a) => {
return acc.map(set => Object.assign({}, set, { data: set.data.concat(a[set.label])}));
}, Object.keys(data[0]).map(k => ({label: k, data: []})));
工作小提琴here。