计算数组对象的出现次数
我希望根据不同数组中相同对象的出现创建一个计数数组。 到目前为止,我的代码看起来像这样:
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; });
这种方法假设日期都将遵循相同的格式。
编辑:
然后你可以像这样循环它,并简单地将结果连接到另一个数组:
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/