通过使用underscoreJS lib并操纵一些数据,我有了这个对象
var data = {
"2017-09-26": [
{
"id": 274281,
"value": 10
},
{
"id": 274282,
"value": 20
}],
"2017-09-27": [
{
"id": 274281,
"value": 12
},
{
"id": 274282,
"value": 13
}],
}
我想通过在子对象中传递键作为日期并将id键的值转换为值的新键
来获得此结果 var data = [{
date:"2017-09-26",
274281: 10,
274282: 20
},
{
date:"2017-09-27",
274281: 12,
274282: 13
}]
请有人作为一个想法,帮助我做到这一点,理想的效率? 感谢
答案 0 :(得分:0)
您需要嵌套循环。第一级创建具有date
属性的对象,然后循环遍历该值中的对象,并将id: value
属性添加到结果中。
var newdata = _.map(data, (date, objects) => {
res = {date: date};
_.each(objects, obj => {
res[obj.id] = obj.value;
});
return res;
});
答案 1 :(得分:0)
这是一行:
Object.keys(data).map(key => ({date: key, ...data[key].reduce((p, c) => {p[c.id] = c.value; return p}, {})}))
结果:
[{
"274281":10,
"274282":20,
"date":"2017-09-26"
},
{
"274281":12,
"274282":13,
"date":"2017-09-27"
}]
答案 2 :(得分:0)
您可以在Array.from()
的结果上使用Object.entries(data)
来创建一个对象数组,方法是将回调函数作为第二个参数传递。
然后,对于每个子数组,使用.reduce()
从其成员创建一个新对象。
var data = {
"2017-09-26": [
{ "id": 274281, "value": 10 },
{ "id": 274282, "value": 20 }
],
"2017-09-27": [
{ "id": 274281, "value": 12 },
{ "id": 274282, "value": 13 }
],
};
const result = Array.from(Object.entries(data), ([key, arr]) =>
arr.reduce((res, {id, value}) =>
Object.assign(res, {[id]: value})
, {date: key})
);
console.log(result);

这是一个大致相同的,但使用新的对象文字扩展语法。
var data = {
"2017-09-26": [
{ "id": 274281, "value": 10 },
{ "id": 274282, "value": 20 }
],
"2017-09-27": [
{ "id": 274281, "value": 12 },
{ "id": 274282, "value": 13 }
],
};
const result = Array.from(Object.entries(data), ([key, arr]) =>
({date: key,
...Object.assign({}, ...arr.map(({id, value}) => ({[id]: value})))
})
);
console.log(result);