首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在JavaScript数组中按日期合并Like对象

在JavaScript数组中按日期合并Like对象
EN

Stack Overflow用户
提问于 2018-08-21 01:54:47
回答 4查看 945关注 0票数 2

我有以下数组:

var objArray = [
    { num: 1, date: '1/12/2017' },
    { num: 3, date: '1/12/2017' },
    { num: 7, date: '1/12/2017' },
    { num: 1, date: '1/13/2018' },
    { num: 3, date: '1/16/2018' },
    { num: 4, date: '1/16/2018' }
   ];

我希望将具有相同日期的数组组合在一起,以便输出数组看起来如下所示:

var outputArr = [
    { num: 11, date: '1/12/2017' },
    { num: 1,  date: '1/13/2018' },
    { num: 7,  date: '1/16/2018' }
   ];

我正在添加所有日期相似的num,并创建一个新对象。

我有一个非常大的数据集,像这样的对象,所以我正在努力减少处理时间。

我已经按日期对数组进行了排序,这样它就可以镜像objArray

For循环看起来很麻烦,因为我获取数组中的第一个日期,并使用下面的伪代码检查数组中的每个其他元素:

var newArr = [];
for(i = 0; i < objArray.length; i++) {
    for(j = 0; j < objArray.length; j++) {
        var tempArr = [];
        // check every date manually
        // add similar to new array
        tempArr.push({ similar items });
    }
    newArr.push(tempArr):
}

// Do another couple loops to combine those like arrays into another array    

必须有一种比运行多个for循环更优雅的方式来执行此操作。

如有任何建议,我们将不胜感激。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-08-21 01:59:43

只需使用Array.reduce()创建地图并按日期分组,地图上的Object.values()将为您提供所需的输出值:

let arr = [ { num: 1, date: '1/12/2017' }, { num: 3, date: '1/12/2017' }, { num: 7, date: '1/12/2017' }, { num: 1, date: '1/13/2018' }, { num: 3, date: '1/16/2018' }, { num: 4, date: '1/16/2018' } ];
   
let result = Object.values(arr.reduce((a, {num, date})=>{
  if(!a[date])
    a[date] = Object.assign({},{num, date});
   else
    a[date].num += num;
  return a;
 },{}));
 console.log(result);

票数 4
EN

Stack Overflow用户

发布于 2018-08-21 02:09:38

使用lodash,

// Aggregate num from unique dates
var g = _.groupBy(objArray,'date')
Object.keys(g).map(k=>({num:g[k].reduce((a,c)=>c.num+a,0),date:k})) 
票数 2
EN

Stack Overflow用户

发布于 2018-08-21 02:06:11

var objArray = [
    { num: 1, date: '1/12/2017' },
    { num: 3, date: '1/12/2017' },
    { num: 7, date: '1/12/2017' },
    { num: 1, date: '1/13/2018' },
    { num: 3, date: '1/16/2018' },
    { num: 4, date: '1/16/2018' }
   ];

let outputArr = Array.from(objArray.reduce((acc, obj)=>{
  acc.set(obj.date, (acc.get([obj.date]) || 0) + obj.num);
  return acc;
}, new Map()))
.map(kv=>({num: kv[1], date: kv[0]}))

console.log(outputArr);

提供:

[ { num: 11, date: '1/12/2017' },
  { num: 1, date: '1/13/2018' },
  { num: 7, date: '1/16/2018' } ]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51936130

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档