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

Javascript underscore data format array of object

通过使用 underscoreJS 库和操作一些数据,我得到了这个对象

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 键的值转换为 value

值的新键来获得下面的结果
   var data = [{  
                 date:"2017-09-26",
                 274281: 10,
                 274282: 20
              },
              {
                 date:"2017-09-27",
                 274281: 12,
                 274282: 13
              }]

请问有没有人可以帮助我做到这一点并且最理想有效? 谢谢

您需要嵌套循环。第一级创建具有 date 属性 的对象,然后循环遍历该值中的对象,并将 id: value 属性添加到结果中。

var newdata = _.map(data, (date, objects) => {
    res = {date: date};
    _.each(objects, obj => {
        res[obj.id] = obj.value;
    });
    return res;
});

这是一行:

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"
}]

您可以对 Object.entries(data) 的结果使用 Array.from(),通过将回调函数作为第二个参数传递来创建对象数组。

然后对于每个子数组,使用 .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);