Javascript下划线数据格式的对象数组

时间:2017-10-26 21:04:05

标签: javascript multidimensional-array underscore.js

通过使用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
              }]

请有人作为一个想法,帮助我做到这一点,理想的效率? 感谢

3 个答案:

答案 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);