JQuery Javascript按最高计数排序数组

时间:2013-10-19 09:19:22

标签: javascript jquery arrays sorting count

我有:

myArray = ["ABAB", "ABAB", "ABAB", "CDCD", "EFEF", "EFEF"]

我需要根据事件计算并按最高计数排序。这将是回报:

ABAB 3
EFEF 2
CDCD 1

请注意,数组中的参数会不断更改,因此对每个静态或文字文本模式的“grepping”将无济于事。

用JQuery或普通JS来实现这个的最快方法吗?

5 个答案:

答案 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中查看控制台以查看生成的对象

http://jsfiddle.net/4dqeK/1/

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>";
    }