Я понял, что мы не можем сортировать ключи объектов js по значениям, поскольку порядок ключей каждый раз случайный.
Это не так (это не случайно, икаждый раз это не отличается), но сортировка JavaScript объектов почти никогда не бывает полезной.
У вас есть несколько вариантов, чтобы получить массив, который вы показали. Один простой способ - использовать Object.entries
для получения массива [key, value]
массивов, затем sort
, а затем получить только ключи от него через map
:
const obj = {'a':20,'b':6,'c':21,'d':12};
const keys = Object.entries(obj)
.sort(([k1, v1], [k2, v2]) => v2 - v1)
.map(([k, v]) => k);
console.log(keys);
Object.entries
является относительно новым, но при необходимости легко заполняется.
Если вам это нужно в ES5 (с заполнением Object.entries
):
var obj = {'a':20,'b':6,'c':21,'d':12};
var keys = Object.entries(obj)
.sort(function(e1, e2) {
return e2[1] - e1[1];
})
.map(function(e) {
return e[0];
});
console.log(keys);
В комментарии вы спросили, как получить значения в отдельном массиве. Вы можете создать этот массив значений как побочный эффект map
, нажав на него, например:
const obj = {'a':20,'b':6,'c':21,'d':12};
const values = [];
const keys = Object.entries(obj)
.sort(([k1, v1], [k2, v2]) => v2 - v1)
.map(([k, v]) => {
values.push(v);
return k;
});
console.log(keys);
console.log(values);
... или если использование map
для побочных эффектов беспокоит вас (часто это не лучшая практика), просто используйте forEach
(или for-of
) вместо:
const obj = {'a':20,'b':6,'c':21,'d':12};
const keys = [];
const values = [];
Object.entries(obj)
.sort(([k1, v1], [k2, v2]) => v2 - v1)
.forEach(([k, v]) => {
keys.push(k);
values.push(v);
});
console.log(keys);
console.log(values);
Версия for-of
:
const obj = {'a':20,'b':6,'c':21,'d':12};
const keys = [];
const values = [];
for (const [k, v] of Object.entries(obj).sort(([k1, v1], [k2, v2]) => v2 - v1)) {
keys.push(k);
values.push(v);
}
console.log(keys);
console.log(values);
(Вы можете использовать временную переменную для результата .sort
, затем использовать for (const [k, v] of theTemporaryVariable) {
.)