Сортировать объект по значению с помощью lodash - PullRequest
0 голосов
/ 04 февраля 2019

У меня есть объект, который выглядит следующим образом:

var unsorted = {a: 15, b: 1,c: 2, d: 4, e: 3, f: 6, g: 1}

И мне интересно отсортировать его в порядке убывания с lodash, поэтому ожидаемый результат должен быть:

var sortd = {b: 1, g: 1,c: 2, e: 3, d: 4, f: 6, a: 15}

Я пытался использовать lodash orderBy, но он дает массив только отсортированных значений.

_.orderBy(tempCount, Number, ['desc'])

//Result
[1,1,2,3,4,6,15]

Ответы [ 3 ]

0 голосов
/ 04 февраля 2019

JavaScript не гарантирует порядок ключей в объекте, поэтому lodash возвращает вам массив, потому что объект с упорядоченными ключами не гарантируется.См. Этот SO вопрос .

Однако вы можете использовать Map, который гарантирует порядок ключей.

Вы можете сделать это с чистымJavaScript:

const unsorted = { a: 15, b: 1,c: 2, d: 4, e: 3, f: 6, g: 1 };

const sorted = new Map(Object.entries(unsorted).sort((a, b) => a[1] - b[1]));

for (const [key, val] of sorted) {
  console.log(key, val);
}

У вас есть несколько способов перебора содержимого результирующей карты:

  • map.values(): получить массив значений
  • map.entries(): получить массив [key, value] пар
  • map.keys(): получить массив ключей

См. документ о карте .

0 голосов
/ 04 февраля 2019

Здесь у вас есть другой подход ( без lodash ).По сути, мы создаем и массив типа [[key1, value1], [key2, value2],...], используя Object.entries(unsorted), затем сортируем этот массив (по возрастанию / убыванию), сравнивая values, чтобы в итоге снова построить структуру объекта, которую вы изначально создали, сначала сопоставив пары [key, value] объектам{key: value} и затем присвоение всех этих объектов новому, используя Object.assign().

var unsorted = {a: 15, b: 1,c: 2, d: 4, e: 3, f: 6, g: 1};

let sortedAsc = Object.entries(unsorted)
    .sort(([k1,v1], [k2,v2]) => v1 - v2)
    .map(([x,y]) => ({[x]:y}));
    
let sortedDesc = Object.entries(unsorted)
    .sort(([k1,v1], [k2,v2]) => v2 - v1)
    .map(([x,y]) => ({[x]:y}));

let objSortedAsc = Object.assign({}, ...sortedAsc);
let objSortedDesc = Object.assign({}, ...sortedDesc);

console.log("ASC: ", objSortedAsc, "DESC: ", objSortedDesc);
0 голосов
/ 04 февраля 2019

Вы можете построить новый объект с отсортированными парами ключ / значение.

Фактический стандарт или порядок свойств:

  • сортировать индекс сначала по ключам, по порядку
  • хранить все остальные ключи в порядке следования

Для полного контроля над заказом возьмите массив с ключами и возьмите его в качестве отсортированного метода доступа для значений.

var unsorted = { a: 15, b: 1,c: 2, d: 4, e: 3, f: 6, g: 1 },
    sorted = _(unsorted)
        .toPairs()
        .orderBy([1], ['desc'])
        .fromPairs()
        .value()
        
console.log(sorted);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>

Сортировка по убыванию с _.orderBy с использованием последнего параметра для определенного заказа вместо _.sortBy, что позволяет сортировать только по возрастанию.

var unsorted = { a: 15, b: 1,c: 2, d: 4, e: 3, f: 6, g: 1 },
    sorted = _(unsorted)
        .toPairs()
        .orderBy(1, 'desc')
        .fromPairs()
        .value()
        
console.log(sorted);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
...