2011-03-16 163 views
2

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

我正在考虑迭代原始列表并将每个值插入到新列表中,同时每次执行插入操作时都要通过与新列表的现有值进行比较来检查正确的布局。然而,这看起来很浪费,因为我必须(可能)检查每个插入的新列表的每个值。

任何人都有一个更简单的方法呢?

+0

如何[5,4,0,1,2,3]从[2,2,4,5跟进, 1,6]? – Alex 2016-12-13 02:51:36

回答

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上提出,不幸的是。

+0

这工作,我喜欢它比我的工作更好。谢谢 – Pete 2011-03-16 15:45:38

+1

我已经学会了我们应该如何迭代数组。看我的编辑。 – 2012-02-03 01:41:03

+2

不适用于[stacksort](http://gkoberger.github.com/stacksort/)。 :-( – Athari 2013-03-19 11:09:39

0

使用nice 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]