我有:
myArray = ["ABAB", "ABAB", "ABAB", "CDCD", "EFEF", "EFEF"]
我需要根据事件计算并按最高计数排序。这将是回报:
ABAB 3
EFEF 2
CDCD 1
请注意,数组中的参数会不断更改,因此对每个静态或文字文本模式的“grepping”将无济于事。
用JQuery或普通JS来实现这个的最快方法吗?
答案 0 :(得分:4)
第一步:构建直方图,作为地图元素 - >它的速度频率(假设所有元素都是字符串):
var histogramMap = {};
for(var i=0, len=myArray.length; i<len; i++){
var key = myArray[i];
histogramMap[key] = (histogramMap[key] || 0) + 1;
}
第二步:转换为输出对象数组:
var histogram = [];
for(key in histogramMap) histogram.push({key: key, freq: histogramMap[key]});
第三步:对直方图进行排序
histogram.sort(function(a,b){return b.freq - a.freq})
这也假定Object.prototype
未被修改。这是一个安全的假设,很多(我认为)库,包括jQuery,都做出了这样的假设。但是,如果您决定向Object.prototype
添加可枚举属性,则for..in
会选择这些属性。如果您想要安全,请将第二步修改为:
var histogram = [];
for(key in histogramMap){
if(histogramMap.hasOwnProperty(i)){
histogram.push({key: key, freq: histogramMap[key]});
}
}
答案 1 :(得分:1)
我最近创建了一个具有这样功能的库。
var items = {}, sortableItems = [], i, len, element,
listOfStrings = ["ABAB", "ABAB", "ABAB", "CDCD", "EFEF", "EFEF"];
for (i = 0, len = listOfStrings.length; i < len; i += 1) {
if (items.hasOwnProperty(listOfStrings[i])) {
items[listOfStrings[i]] += 1;
} else {
items[listOfStrings[i]] = 1;
}
}
for (element in items) {
if (items.hasOwnProperty(element)) {
sortableItems.push([element, items[element]]);
}
}
sortableItems.sort(function (first, second) {
return second[1] - first[1];
});
console.log(sortableItems);
<强>输出强>
[ [ 'ABAB', 3 ], [ 'EFEF', 2 ], [ 'CDCD', 1 ] ]
答案 2 :(得分:-1)
试试这个:
array_elements = ["ABAB", "ABAB", "ABAB", "CDCD", "EFEF", "EFEF"];
var result_array = [];
var current = null;
var cnt = 0;
for (var i = 0; i < array_elements.length; i++) {
if (array_elements[i] != current) {
if (cnt > 0) {
result_array.push([current,cnt]);
}
current = array_elements[i];
cnt = 1;
} else {
cnt++;
}
}
if (cnt > 0) {
result_array.push([current,cnt]);
}
result_array.sort(function(x,y) {return y[1] - x[1]})
alert(result_array);
result_array将有结果。
答案 3 :(得分:-1)
在firefox中查看控制台以查看生成的对象
myArray = ["ABAB", "ABAB", "ABAB", "CDCD", "EFEF", "EFEF"];
container={};
for(var i=0; i < myArray.length;i++){
var el=myArray[i];
if( el in container){
container[el].push(el);
}
else{
container[el]=[];
container[el].push(el);
}
}
console.log(container);
答案 4 :(得分:-1)
$array = array("ABAB", "ABAB", "ABAB", "CDCD", "EFEF", "EFEF");
$array1=array_count_values($array);
arsort($array1);
foreach($array1 as $x=>$x_value)
{
echo "Key=" . $x . ", Value=" . $x_value;
echo "<br>";
}