我想对数组的元素进行排序[关闭]

Posted

技术标签:

【中文标题】我想对数组的元素进行排序[关闭]【英文标题】:I want to sort the element of array [closed] 【发布时间】:2016-07-26 01:30:47 【问题描述】:

假设我有如下数组

var array=[3,4,5,5,5,6,8,3,12,1,1,1];

那么结果应该是

array=[5,1,3,4,6,8,12];

javascript 或 nodejs 中的必需实现

【问题讨论】:

请add the code you've written 以及您遇到的问题。 SO 不会为您编写代码。 【参考方案1】:
function sortArray(array)  

    var reducedArray = array.filter(function(item, pos)  //A copy without duplicates
       return array.indexOf(item) == pos;
    )

    var elementFreq =  //Object that contains element frequencies
    for (var i=0; i<reducedArray.length; i++) 
        var count = 0;
        for (var j=0; j<array.length; j++) 
            if (array[j] == reducedArray[i]) 
                count++;
            
        
        elementFreq[array[i]] = count;
    

    function compare(a,b)  //compares the frequency of two elements
        return elementFreq[b]-elementFreq[a]
    

    reducedArray.sort(compare) //sorts reducedArray based using compare function

    return reducedArray 

【讨论】:

这是可以理解的代码,但不必要地低效。您肯定不想每次比较两个项目时都遍历整个数组。 @Harangue 你说得对,感谢您的反馈。在比较之前,我编辑了代码以存储元素频率。【参考方案2】:

var array = [3, 4, 5, 5, 5, 6, 8, 3, 12, 1, 1, 1];

var obj = ;

array.forEach(e => obj[e] = obj[e] + 1 || 1);

var sorted = Object.keys(obj)
    .map(e => ( n: e, times: obj[e] ))
    .sort((a, b) => b.times - a.times)
    .map(e => e.n);

document.write(sorted);

【讨论】:

【参考方案3】:

我在这个jsbin example 中使用了lodash 和纯JavaScript 数组方法的组合:

var arr = [3,4,5,5,5,6,8,3,12,1,1,1];

var sorted = _.sortBy(_.toPairs(arr.reduce(function(agg, curr) 
  agg[curr] = agg[curr] ? agg[curr] + 1 : 1;

  return agg;
, )), function(pair) 
  return -pair[1];
).map(function(pair) 
  return pair[0];
);

console.log(sorted); // => ["1", "5", "3", "4", "6", "8", "12"]

但是,"5""1" 的顺序与 3,4,6,8,12 的顺序不同,因为没有为具有相同计数的数字指定排序顺序。

上面所做的是创建一个number=&gt;count 的映射(例如 "1": 3, "5": 3 ),然后将它们配对为元组(因为在JavaScript 中无法确定地对对象进行排序:[["1", 3], ["5", 3]])。然后,我们简单地根据计数对元组集合进行排序,并映射元组集合以仅返回数字(例如["1", "5", /* etc. */ ])。

【讨论】:

【参考方案4】:

这是一种方法: JSBIN:https://jsbin.com/josuwir/1/edit?js,console

var array=[3,4,5,5,5,6,8,3,12,1,1,1];

var c = array.reduce(function(a, b) 
  a[b] = ++a[b] || 1;
  return a;
, );


var keys = Object.keys(c);


var nn = keys.sort(function(a, b) 
  if (c[a] < c[b]) 
    return 1;
   else 
    return -1;
  
).map(function(a) return Number(a));

【讨论】:

以上是关于我想对数组的元素进行排序[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

java数组排序

如何对二维数组的列进行排序?

根据索引从排序的升序数组生成输出

对多个数组进行排序和切片[关闭]

将数组存储在向量中并对元素进行排序[关闭]

将php数组值排序或显示为钟形曲线