В javascript, есть ли простой способ сортировать пары ключ-значение по значению и возвращать ключ?
В javascript существует ли простой способ сортировки пар ключ-значение по значению (предположим, что значение является числовым) и вернуть ключ? Способ jQuery для этого также будет полезен.
(Здесь есть много связанных вопросов о парах ключ-значение, но я не могу найти их специально для сортировки.)
Ответы
Ответ 1
Нет ничего сложного в этом кросс-браузере. Предполагая такой массив, как
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"];
Ответ 2
Предположим, что мы имеем Array
of Objects
, например:
var data = [
{foo: 6},
{foo: 2},
{foo: 13},
{foo: 8}
];
Мы можем вызвать Array.prototype.sort()
help, использовать Array.prototype.map()
help, чтобы сопоставить новый массив и Object.keys()
help, чтобы захватить ключ:
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.
Ответ 3
Насколько я знаю, нет встроенной функции 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/
Ответ 4
Учитывая
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' ]
Ответ 5
Если вы не можете рассчитывать на свойства выделенного массива и объекта,
вы можете использовать оригинальные методы 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
*/