Сортировка массива объектов по значениям - PullRequest
0 голосов
/ 21 апреля 2020

Мне нужно отсортировать массив объектов по его значениям, и я использую этот код для этого:

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

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

dict = {a:1, d:4, c:2, b:4, e:5, f:3} должно быть:

{a:1, c:2, f:3, b:4, d:4, e:5 }

но я получаю это:

{a:1, c:2, f:3, d:4, b:4, e:5 }

Ответы [ 2 ]

2 голосов
/ 21 апреля 2020

Вы можете изменить функцию сравнения для использования localeCompare

dict[a] - dict[b] || a.localeCompare(b)

Если dict[a] - dict[b] вернет 0, он проверяет следующее условие и сортирует ключи по алфавиту

Вот фрагмент:

const dict = {a:1, d:4, c:2, b:4, e:5, f:3}

function compare(a, b) {
  return dict[a] - dict[b] || a.localeCompare(b)
}

const sorted = Object.keys(dict)
                      .sort(compare)
                      .reduce((acc, k) => (acc[k] = dict[k], acc), {})

console.log( sorted )
1 голос
/ 21 апреля 2020

Поэтому сравните ключи, если разность равна нулю

function compare(a, b) {
  var diff = dict[a] - dict[b]
  return diff === 0 ? a.localeCompare(b) : diff
}

const dict = {
  a: 1,
  d: 4,
  c: 2,
  b: 4,
  e: 5,
  f: 3
}

const result = Object.keys(dict).sort(compare).reduce((o, x) => ({
  ...o,
  [x]: dict[x],
}), {})

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