【问题标题】:JQuery Javascript Sort Array by Highest CountJQuery Javascript按最高计数排序数组
【发布时间】:2013-10-19 09:19:22
【问题描述】:

我有:

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

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

ABAB 3
EFEF 2
CDCD 1

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

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

【问题讨论】:

  • 是否允许外部库?这应该是带有 underscore.js 的单行代码
  • 不,只是 jquery 内部托管。
  • 还有,有想法吗?应该很容易找到解决方案
  • 好吧,您可以遍历数组并将每个唯一项放在其自己的数组中的临时对象中。然后检查您的对象是否有一个数组,其中第一个元素与当前元素相同...如果是,则添加到该数组。
  • @JanDvorak,很遗憾没有。相同的元素遵循任意顺序,这就是为什么让我忙了这么久。

标签: javascript jquery arrays sorting count


【解决方案1】:

第一步:构建直方图,作为地图元素 -> 速度频率(假设所有元素都是字符串):

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]});
  }
}

【讨论】:

  • @rid jQuery 假定 Object.prototype 没有可枚举的属性。在我的代码中需要 hasOwnProperty 的情况下,jQuery 会中断 ;-) 在循环普通对象时,我习惯性地忽略 hasOwnProperty
  • 太好了,喜欢!一步一步的非常有用。非常感谢。
  • @rid 我从来没有听说过这样的错误。由于 jQuery 做出了这样的假设,因此这个错误不会在 IE8+ 中发生。
【解决方案2】:

我最近创建了一个具有这种功能的库。

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 ] ]

【讨论】:

【解决方案3】:

试试这个:

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 会有结果。

【讨论】:

  • 不要使用document.write。一,是邪恶的。二,你不知道你的代码是否在 DW 只是慢的那一刻运行。第三,您不应该打印 anything
  • document.write 已删除,我使用了 console.log。它应该打印出来。
  • 正如 rid 所指出的,您仍然应该将结果收集到一个数组中,而不是在任何地方打印出来。
  • 关闭,但我认为带有键和频率的字符串没有用;-)
  • 请看一下我的代码。结果将存储在 result_array
【解决方案4】:

在 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);

【讨论】:

  • 不要将for..in 用于数组。您可以选择填充方法和其他非数字属性。此外,没有指定迭代顺序(这里不是真正的问题)。
  • 另外,我不认为数组["abab", "abab", "abab"] 是表示"abab" 出现三次的有效方式。此外,您不会按频率对结果进行排序。
  • 嗨,我只是在演示如何做到这一点。当然这不是最有效的方法。你可以很容易地让它变得更好。顺便说一句,我编辑了我的答案以摆脱 for in,你是对的。我只用了 in 因为它的输入速度更快 ;-)
【解决方案5】:
$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>";
    }

【讨论】:

  • 语言错误,您甚至没有按要求对输出进行排序。
  • Jan Dvorak- 对不起语言,现在根据需要检查它的工作
  • 它仍在 PHP 中,因此在 javascript 环境中没有用(这是一个 javascript 问题)。特别是因为所有的实现都隐藏在一些纯 javascript 所没有的库调用中。另外,请不要使用&lt;br&gt;s。即使是测试,&lt;p&gt;s 也能更好地工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多