2

我有:

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

我需要按出现次数计数并按最高计数排序。这将是回报:

ABAB 3
EFEF 2
CDCD 1

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

知道使用 JQuery 或普通 JS 最快的方法吗?

4

5 回答 5

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]});
  }
}
于 2013-10-19T09:40:09.007 回答
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 ] ]
于 2013-10-19T12:01:06.870 回答
-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>";
    }
于 2013-10-19T10:35:23.660 回答
-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 将有结果。

于 2013-10-19T09:29:57.360 回答
-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);
于 2013-10-19T09:43:07.970 回答