2011-03-16 283 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]