Упорядочить массив по имени перечисления вместо значения

#javascript #typescript #lodash

#javascript #typescript #Lodash

Вопрос:

У меня есть перечисление:

 export enum Foo{
    AA= 0,
    ZZ= 1,
    AB= 2,
    ER = 5
}
  

Я хочу, чтобы мои Bars , которые содержат свойство enum as foo , сортировались по имени перечисления (AA, AB, ER, ZZ), а не по числовому значению (0, 1, 2, 5).

Я использую Lodash, чтобы помочь мне, но, похоже, я не могу заставить его работать:

 const orderedBars = _.orderBy(unorderedBars, 'foo');
  

Ответ №1:

Вы могли бы использовать localeCompare sort их на основе строкового значения:

 unorderedBars.sort((a,b) => Foo[a.foo].localeCompare(Foo[b.foo]))
  

Foo[a.foo].localeCompare(Foo[b.foo]))

// displaying on the DOM
const pre = document.createElement(«pre»);
pre.innerHTML = JSON.stringify(array, null, 3)
pre.innerHTML += JSON.stringify(array.map(a => Foo[a.foo]), null, 3) // to see the string values
document.body.appendChild(pre);
» rel=»nofollow noreferrer»>Демонстрация на Typescript playgorund
(нажмите «Выполнить»)

Если свойство является строковым, и вы хотите отсортировать его на основе числового значения, вы могли sort бы сделать это следующим образом:

 unorderedBars.sort((a, b) => Foo[a.foo] - Foo[b.foo])