сортировать ключи массива по значению - PullRequest
2 голосов
/ 16 марта 2011

Я использую JavaScript, и у меня есть массив, содержащий несколько значений, которые могут быть неуникальными.Я хотел бы взять этот массив и сгенерировать новый массив или упорядоченный список его ключей в порядке возрастания значений.Например, если у меня есть [2, 2, 4, 5, 1, 6], я бы хотел сгенерировать [5, 4, 0, 1, 2, 3].

Я думал оперебирая исходный список и вставляя каждое значение в новый список, проверяя правильность размещения путем сравнения с существующими значениями нового списка каждый раз, когда выполняется вставка.Это кажется расточительным, поскольку мне пришлось бы (потенциально) проверять каждое значение нового списка для каждой вставки.

У кого-нибудь есть более простой метод для этого?

Ответы [ 2 ]

4 голосов
/ 16 марта 2011

Я думаю, вы имели в виду [ 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 голосов
/ 25 апреля 2013

Использование симпатичного 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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...