Есть ли в javascript простой способ сортировки пар ключ-значение по значению и возврата ключа? - PullRequest
12 голосов
/ 11 февраля 2011

Есть ли в javascript простой способ сортировки пар ключ-значение по значению (предположим, что это числовое значение) и возвращении ключа? Способ jQuery для этого также будет полезен.

(Здесь много связанных вопросов о парах ключ-значение, но я не могу найти один конкретно о сортировке.)

Ответы [ 5 ]

20 голосов
/ 11 февраля 2011

Нет ничего легкого сделать этот кросс-браузер. Предполагая массив, такой как

var a = [
    {key: "foo", value: 10},
    {key: "bar", value: 1},
    {key: "baz", value: 5}
];

... вы можете получить массив свойств key, отсортированных по value следующим образом:

var sorted = a.slice(0).sort(function(a, b) {
   return a.value - b.value;
});

var keys = [];
for (var i = 0, len = sorted.length; i < len; ++i) {
    keys[i] = sorted[i].key;
}

// keys is ["bar", "baz", "foo"];
7 голосов
/ 11 февраля 2011

Предположим, у нас есть Array из Objects, например:

var data = [
    {foo: 6},
    {foo: 2},
    {foo: 13},
    {foo: 8}
];

Мы можем вызвать Array.prototype.sort() help , использовать Array.prototype.map() help для сопоставления нового массива и Object.keys() помогите захватить ключ:

var keys = data.sort(function(a,b) {
    return a.foo - b.foo;
}).map(function(elem, index, arr) {
   return Object.keys(elem)[0];
});

Помните, что Array.prototype.map() требует Javascript 1.6 , а Object.keys() - ECMAscript5 (требуется Javascript 1.8.5 ).

Вы найдете альтернативный код для всех этих методов в MDC.

4 голосов
/ 28 августа 2015

С учетом

var object = {
  'a': 5,
  'b': 11,
  'c': 1,
  'd': 2,
  'e': 6
}

Вы можете отсортировать ключи object по их значениям с помощью следующего:

Object.keys(object).sort(function (a, b) {
  return object[a] - object[b]
}))

Результат

[ 'c', 'd', 'a', 'e', 'b' ]
4 голосов
/ 11 февраля 2011

Насколько я знаю, нет встроенной функции Javascript для сортировки массива по его ключам.

Однако для этого не нужно слишком много кода: просто извлеките ключи в их собственный массив, отсортируйте их с помощью обычной функции sort и пересоберите массив в правильном порядке. Нечто подобное должно сработать:

function SortArrayByKeys(inputarray) {
  var arraykeys=[];
  for(var k in inputarray) {arraykeys.push(k);}
  arraykeys.sort();

  var outputarray=[];
  for(var i=0; i<arraykeys.length; i++) {
      outputarray[arraykeys[i]]=inputarray[arraykeys[i]];
  }
  return outputarray;
}

Теперь вы можете просто вызывать свою функцию так:

var myarray = {'eee':12, 'blah':34 'what'=>66, 'spoon':11, 'snarglies':22};
myarray = SortArrayByKeys(myarray);

И вывод будет:

{'blah':34, 'eee':12, 'spoon':11, 'snarglies':22, 'what':66}

Надеюсь, это поможет.

Рабочая тестовая страница здесь: http://jsfiddle.net/6Ev3S/

1 голос
/ 11 февраля 2011

Если вы не можете рассчитывать на расширенный массив и свойства объекта,

Вы можете использовать оригинальные методы Array-

function keysbyValue(O){
    var A= [];
    for(var p in O){
        if(O.hasOwnProperty(p)) A.push([p, O[p]]);
    }
    A.sort(function(a, b){
        var a1= a[1], b1= b[1];
        return a1-b1;
    });
    for(var i= 0, L= A.length; i<L; i++){
        A[i]= A[i][0];
    }
    return A;
}
//test

    var Obj={a: 20, b: 2, c: 100, d: 10, e: -10};
    keysbyValue(Obj)

    /*  returned value: (Array)
    e,b,d,a,c
    */
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...