计算数组对象的出现次数

我希望根据不同数组中相同对象的出现创建一个计数数组。 到目前为止,我的代码看起来像这样:

var dates = []; $.each(items, function (i, item) { dates.push(item.date); }); 

返回:

 ['2013/03', '2013/03', '2012/01', '2012/11', '2012/09', '2012/09', '2012/09'] 

在那之后,我想得到一个如下所示的数组:

 [2,1,1,3] 

任何帮助将非常感激!

我会使用键/值计数方法,其中日期是键,值是它出现的次数如下:

 var counters = {}; $.each(dates, function(i, date) { counters[date] = counters[date] ? counters[date] + 1 : 1; }); 

这种方法假设日期都将遵循相同的格式。

编辑:

http://jsfiddle.net/wMR9x/2/

然后你可以像这样循环它,并简单地将结果连接到另一个数组:

 var finalCounts = []; var i = 0; for(var key in counters) finalCounts[i++] = counters[key]; 
 var dates=['2013/03', '2013/03', '2012/01', '2012/11', '2012/09', '2012/09', '2012/09']; var count={}; var count_array=[]; for (i in dates){ count[dates[i]] =count[dates[i]]?count[dates[i]]+1:1; } for (i in count){ count_array.push(count[i]); } console.log(count_array); 

的jsfiddle

尝试使用countBy中的countBy函数:

 _.countBy(dates,_.identity); 

这将返回表单的对象

 {'2013/03':2, ...} 

如果要仅从该对象检索计数,请使用_.values函数。

尝试

 var src = ['2013/03', '2013/03', '2012/01', '2012/11', '2012/09', '2012/09', '2012/09']; var cnts = []; for(var i = 0; i < src.length; i++){ var val = src[i]; var count = 1; while( val == src[i + 1]){ count++; i++; } cnts.push(count) } 

演示: 小提琴

您可以使用javascript数组的push方法来实现此目的

 var arr = ['2013/03', '2013/03', '2012/01', '2012/11', '2012/09', '2012/09', '2012/09']; var x = [],y = [], prev; for (var i = 0; i < arr.length; i++) { if (arr[i] !== prev) { x.push(arr[i]); y.push(1); } else { y[y.length - 1]++; } prev = arr[i]; } console.log(y); 

的jsfiddle

您可以使用地图来有效地计算重复值,以跟踪您已经看到的值,如下所示:

 var data = ['2013/03', '2013/03', '2012/01', '2012/11', '2012/09', '2012/09', '2012/09']; var map = {}; var sequence = []; for (var i = 0; i < data.length; i++) { var item = data[i]; if (map[item]) { map[item]++; } else { map[item] = 1; sequence.push(item); } } var output = []; for (i = 0; i < sequence.length; i++) { output.push(map[sequence[i]]); } // output contains [2,1,1,3] 

工作演示: http : //jsfiddle.net/jfriend00/rQ7KB/