2014-10-09 53 views
0

我有一个对象数组,我想计算不同元素的数量和这些对象的计数。从一个对象数组中计数和存储不同的元素和它们的计数

[ { name: 'Suman', 
    game: '5A' 
    }, 
    { name: 'Suman', 
    game: '5A' 
    }, 
    { name: 'Namus', 
    game: '5A' 
    }, 
    { name: 'Namus', 
    game: '5A' 
    } 
] 

我想统计不同名称的数量并将它们存储在一个对象中。我已经尝试了1#推送数组中的所有名字, 2#然后对它们进行排序, 3#然后计算不同名称的数量并最终将它们推送到对象。 这个过程太长。有没有更简单的方法来做到这一点。我使用的NodeJS

在此先感谢

回答

0

这是使用reduce function一个伟大的地方:

的减少()方法应用于对一个储液器的功能和所述阵列的每一 值(从左到右)具有将其降低到单个值为。

...

减少一次执行回调函数对于每个本元件中 阵列,不含所述阵列中的孔,容纳四个参数: 初始值(或值从以前的回叫呼叫), 当前元素的值,当前索引以及发生迭代的阵列的值。

这将是这个样子:

var arr = [ { name: 'Suman', 
    game: '5A' 
    }, 
    { name: 'Suman', 
    game: '5A' 
    }, 
    { name: 'Namus', 
    game: '5A' 
    }, 
    { name: 'Namus', 
    game: '5A' 
    } 
] 

var counts = arr.reduce(function(counts, item) { 
    counts[item.name] = (counts[item.name] || 0) + 1; 
    return counts; 
}, {}); 

counts则是:

{ Suman: 2, Namus: 2 } 

要求在评论:

如果我想要的合作在对象的数组像 [{name: 'Suman', count:'2'}, {name:'Namus', count:'2'}]

UNT以及名称。如果你已经有counts从上面的reduce电话,那么你就可以map其按键到你想要的格式:

var countsArray = Object.keys(counts).map(function(name) { 
    return {name: name, count: counts[name]}; 
}); 

countsArray然后:

[ { name: 'Suman', count: 2 }, 
    { name: 'Namus', count: 2 } ] 
+0

如果我想要计数以及像 [{name:'Suman',count:2},{name:'Namus',count:2}]对象的数组中的名称 – suman 2014-10-09 19:28:49

+0

@suman我编辑我的回答,并增加了一种方法来做到这一点。 – 2014-10-09 19:43:25

+0

谢谢队友,我从来没有明白过映射。你刚刚睁开眼睛。 – suman 2014-10-09 20:00:28

2

您将创建一个新的对象,其中关键是名称和值计数:

var youArr = [ 
    { name: 'Suman', 
    game: '5A' 
    }, 
    { name: 'Suman', 
    game: '5A' 
    }, 
    { name: 'Namus', 
    game: '5A' 
    }, 
    { name: 'Namus', 
    game: '5A' 
    } 
]; 

var count = {} 
for(var i=0; i < youArr.length; i++){ 
    count[youArr[i].name] = count[youArr[i].name] || 0; 
    count[youArr[i].name]++; 
} 

alert(count['Namus']); // 2 
+1

感谢它的工作真棒。 :) – suman 2014-10-09 18:30:07

相关问题