首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将重复属性值汇总为新对象

将重复属性值汇总为新对象
EN

Stack Overflow用户
提问于 2017-02-21 00:18:46
回答 2查看 39关注 0票数 0

我试图总结出现在如下构造的对象数组中的值:

代码语言:javascript
复制
[ 
  { token: 'N97235', conversions: '2', payout: '100' },
  { token: 'N91567', conversions: '2', payout: '100' },
  { token: 'N91567', conversions: '3', payout: '150' },
  { token: 'N97759', conversions: '2', payout: '100' },
  { token: 'N97240', conversions: '1', payout: '50' },
  { token: 'N13925', conversions: '1', payout: '50' },
  { token: 'N53285', conversions: '1', payout: '50' },
  { token: 'N28312', conversions: '1', payout: '100' },
  { token: 'N96475', conversions: '1', payout: '50' },
  { token: 'N97759', conversions: '2', payout: '100' },
  { token: 'N76951', conversions: '1', payout: '100' },
  { token: 'N39108', conversions: '1', payout: '50' },
  { token: 'N39108', conversions: '4', payout: '200' },
  { token: 'N48854', conversions: '2', payout: '100' },
  { token: 'N50179', conversions: '1', payout: '50' },
  { token: 'N18804', conversions: '1', payout: '50' },
  { token: 'N95631', conversions: '2', payout: '100' },
]

我的意思是,我想把所有的转换和支出相加到一个新的对象中,如下所示

代码语言:javascript
复制
{
  N97235: { conversions: 2, payout: 100 },
  N39108: { conversions: 5, payout: 250 },
  N91567: { conversions: 6, payout: 300},
  N96475: { conversions: 1, payout: 50},
  // ..and so on
}

正如您所看到的,它在原始数组中找到了重复的“条目”,并将它们的转换和支出相加到一个新对象中(单个条目也在其中)。我试图做的是遍历这个数组(在本例中是tokens_array[]),并将其‘objects’属性附加到新创建的对象( conversions_sum{} one),但问题是在向其添加任何内容之前,首先对其值进行“空化”。

代码语言:javascript
复制
tokens_array.forEach(function(element) {
    var token_string = element.token.toString();
    conversions_sum[token_string] = {};
    conversions_sum[token_string].conversions += element.conversions;
    conversions_sum[token_string].payout += element.payout;
});

但是,由于conversions_sumtoken_string.conversions和conversions_sumtoken_string.payout从一开始就没有初始化--它将这个数字添加到“未定义”中。

提前谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-02-21 00:27:07

您可以使用Array.prototype.reduce创建令牌的散列对象,如下所示:

代码语言:javascript
复制
function group(arr) {
  return arr.reduce(function(h, e) {             // for each object e in arr
    if(h[e.token]) {                             // if we already hashed the object
      h[e.token].conversions += +e.conversions;  // add e's conversions to the hashed object (implicitly convert e.conversions into a number using unary +)
      h[e.token].payout += +e.payout;            // add e's payout to the hashed object as well
    }                                            
    else {                                       // if not, then create a new object initialized with e's values
      h[e.token] = {conversions: +e.conversions, payout: +e.payout};
    }

    return h;
  }, {});
}

var array = [ 
  { token: 'N97235', conversions: '2', payout: '100' },
  { token: 'N91567', conversions: '2', payout: '100' },
  { token: 'N91567', conversions: '3', payout: '150' },
  { token: 'N97759', conversions: '2', payout: '100' },
  { token: 'N97240', conversions: '1', payout: '50' },
  { token: 'N13925', conversions: '1', payout: '50' },
  { token: 'N53285', conversions: '1', payout: '50' },
  { token: 'N28312', conversions: '1', payout: '100' },
  { token: 'N96475', conversions: '1', payout: '50' },
  { token: 'N97759', conversions: '2', payout: '100' },
  { token: 'N76951', conversions: '1', payout: '100' },
  { token: 'N39108', conversions: '1', payout: '50' },
  { token: 'N39108', conversions: '4', payout: '200' },
  { token: 'N48854', conversions: '2', payout: '100' },
  { token: 'N50179', conversions: '1', payout: '50' },
  { token: 'N18804', conversions: '1', payout: '50' },
  { token: 'N95631', conversions: '2', payout: '100' },
];

console.log(group(array));

票数 2
EN

Stack Overflow用户

发布于 2017-02-21 00:22:03

那么,初始化它们,对吗?您也每次都要重写新对象,但只希望在不存在新对象时覆盖它。就像这样:

代码语言:javascript
复制
 conversions_sum[token_string] = conversions_sum[token_string] || {
   conversions: 0,
   payout: 0
 };
conversions_sum[token_string].conversions += parseInt(element.conversions, 10);
conversions_sum[token_string].payout += parseInt(element.payout, 10);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42356507

复制
相关文章

相似问题

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