【问题标题】: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 中的必需实现

【问题讨论】:

标签: javascript node.js


【解决方案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)});
      

      【讨论】:

        猜你喜欢
        • 2019-02-24
        • 1970-01-01
        • 2016-01-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-09
        • 1970-01-01
        相关资源
        最近更新 更多