получение значений и ключей в отдельных массивах, отсортированных по значениям - PullRequest
0 голосов
/ 24 октября 2019

Предположим, у меня есть объект {'a':20,'b':6,'c':21,'d':12}

После получения сортировки по значениям в порядке убывания желаемый результат: Keys: ['c','a','d','b'] и Values: [21,20,12,6]

Как я могу добиться этого эффективно? Я понял, что мы не можем сортировать ключи объектов js по значениям, поскольку порядок ключей каждый раз случайный.

Ответы [ 4 ]

3 голосов
/ 24 октября 2019

Я понял, что мы не можем сортировать ключи объектов 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) {.)

1 голос
/ 24 октября 2019
const obj = {'a':20,'b':6,'c':21,'d':12};

const result = Object.keys(obj)
  .reduce((acc, key) => {
    const value = obj[key];
    acc.push({ key, value });
    acc.sort((a, b) => b.value - a.value);
    return acc;
  }, []);

console.log(result);

выход

[
  { key: 'c', value: 21 },
  { key: 'a', value: 20 }
  { key: 'd', value: 12 }
  { key: 'b', value: 6 }
]
0 голосов
/ 24 октября 2019

1) Получить ключи от объекта

2) Сортировать ключи на основе сравнения значений

function cmp(a, b) {
  return (a < b) ? 1 : (a > b) ? -1 : 0
}

function sortObj(obj) {
   const keys = Object.keys(obj).sort((x,y) => cmp(obj[x],obj[y]))
   const vals = keys.map(x => obj[x])
   return {sortedKeys: keys, sortedValues: vals}
}

result = sortObj({'a':20,'b':6,'c':21,'d':12})
console.log(result)

Ответ

{
sortedKeys:  ["c", "a", "d", "b"]
sortedValues: [21, 20, 12, 6]
}
0 голосов
/ 24 октября 2019

Попробуйте это.

const list = {'a':20,'b':6,'c':21,'d':12};

let myObject = Object.fromEntries(Object.entries(list).sort( (a,b) => b[1] - a[1] ));

Object.prototype.mySplit = function() {
  return Object.keys(this).map((key) => {
    return {
      key: key,
      value: this[key]
    };
  });
}

let keys = [];
let values = [];

let properties = myObject.mySplit();
for (var i = 0; i < properties.length; i++) {
    keys.push(properties[i]['key']);
    values.push(properties[i]['value']);
}

console.log(keys);
console.log(values);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...