使用 Underscore 重构对象数组

Re-structuring an array of objects with Underscore

是否可以重新构造以下数组

[
    {"period":"2016-09-18","mp-demo-1":30},
    {"period":"2016-09-18","MP7":20},
    {"period":"2016-09-19","mp-demo-1":13},
    {"period":"2016-09-19","MP7":33},
    {"period":"2016-09-20","mp-demo-1":39},
    {"period":"2016-09-20","MP7":29}
]

进入

[
    {"period":"2016-09-18","mp-demo-1":30,"MP7":20},
    {"period":"2016-09-19","mp-demo-1":13,"MP7":33},
    {"period":"2016-09-20","mp-demo-1":39,"MP7":29},
]

我基本上需要的是通过键(句点)删除重复条目,并将这些对象中包含的值添加到单个对象中。

使用 underscore.js 可以吗?或者是否有另一种使用 jQuery 或任何其他库的方法。

您可以使用带有 reduce()Object.assign()

的纯 javascript 来做到这一点

var data = [
  {"period":"2016-09-18","mp-demo-1":30},
  {"period":"2016-09-18","MP7":20},
  {"period":"2016-09-19","mp-demo-1":13},
  {"period":"2016-09-19","MP7":33},
  {"period":"2016-09-20","mp-demo-1":39},
  {"period":"2016-09-20","MP7":29}
];

var obj = {}
var result = data.reduce(function(r, o) {
  if (!obj[o.period]) {
    obj[o.period] = o;
    r.push(obj[o.period]);
  } else {
    Object.assign(obj[o.period], o);
  }
  return r;
}, []);

console.log(result)

要保留原始数据,您可以使用 Object.assign()

创建对象的克隆

var data = [
  {"period":"2016-09-18","mp-demo-1":30},
  {"period":"2016-09-18","MP7":20},
  {"period":"2016-09-19","mp-demo-1":13},
  {"period":"2016-09-19","MP7":33},
  {"period":"2016-09-20","mp-demo-1":39},
  {"period":"2016-09-20","MP7":29}
];

var obj = {}
var result = data.reduce(function(r, o) {
  if (!obj[o.period]) {
    obj[o.period] = Object.assign({}, o);
    r.push(obj[o.period]);
  } else {
    Object.assign(obj[o.period], o);
  }
  return r;
}, []);

console.log(result);
console.log(data);

使用 lodash:

data = [
    {"period":"2016-09-18","mp-demo-1":30},
    {"period":"2016-09-18","MP7":20},
    {"period":"2016-09-19","mp-demo-1":13},
    {"period":"2016-09-19","MP7":33},
    {"period":"2016-09-20","mp-demo-1":39},
    {"period":"2016-09-20","MP7":29}
];


res = _(data)
    .groupBy('period')
    .map(_.spread(_.merge))
    .value();

console.log(res)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.16.2/lodash.min.js"></script>

香草 ES6:

data = [
    {"period":"2016-09-18","mp-demo-1":30},
    {"period":"2016-09-18","MP7":20},
    {"period":"2016-09-19","mp-demo-1":13},
    {"period":"2016-09-19","MP7":33},
    {"period":"2016-09-20","mp-demo-1":39},
    {"period":"2016-09-20","MP7":29}
];

let map = new Map();

data.forEach(x => map.set(x.period,
    Object.assign(
        map.get(x.period) || {},
        x
)));

console.log([...map.values()])