按值排序数组键

时间:2011-03-16 14:41:27

标签: javascript arrays sorting

我正在使用javascript,并且我有一个包含多个值的数组,这可能是非唯一的。我想取这个数组并按值的升序生成一个新的数组或有序列表。例如,如果我有[2,2,4,5,1,6],我想生成[5,4,0,1,2,3]。

我正在考虑迭代原始列表并将每个值插入新列表,同时通过在每次执行插入时与新列表的现有值进行比较来检查正确的位置。但这似乎很浪费,因为我必须(可能)检查每个插入的新列表的每个值。

任何人都有更简单的方法吗?

2 个答案:

答案 0 :(得分:4)

我认为你的意思是[ 4, 0, 1, 2, 3, 5 ]

function GetSortedKeys(values) {

   var array_with_keys = [];
   for (var i = 0; i < values.length; i++) {
       array_with_keys.push({ key: i, value: values[i] });
   }

   array_with_keys.sort(function(a, b) {
      if (a.value < b.value) { return -1; }
      if (a.value > b.value) { return  1; }
      return 0;
   });

   var keys = [];
   for (var i = 0; i < array_with_keys.length; i++) {
       keys.push(array_with_keys[i].key);
   }

   return keys;
}

var array = [2, 2, 4, 5, 1, 6];
alert(GetSortedKeys(array));

不幸的是,这是我在Javascript上提出的最简单的方法。

答案 1 :(得分:0)

使用不错的Underscore.JS

var get_sorted_keys = function(values) {
    var keys_idx = [], i;
    for (i = 0; i < values.length; i++) {
        keys_idx.push(i);
    }

    var keys = _.sortBy(keys_idx, function(idx){ return values[idx]; });

    return keys;
};

var array = [2, 2, 4, 5, 1, 6];
console.log("Sorted keys:", get_sorted_keys(array));

输出:

Sorted keys: [4, 0, 1, 2, 3, 5]