Lodash сортирует объект по значениям, не теряя ключ
Допустим, у меня есть объект:
{Derp: 17, Herp: 2, Asd: 5, Foo: 8, Qwe: 12}
И мне нужно отсортировать его по значению. То, что я ищу, чтобы получить это:
{Derp: 17, Qwe: 12, Foo: 8, Asd: 5, Herp: 2}
Я хотел бы использовать для этого lodash. Когда я использую _.sortBy
он не сохраняет ключи как никогда:
_.sortBy({Derp: 17, Herp: 2, Asd: 5, Foo: 8, Qwe: 12}).reverse();
// [17, 12, 8, 5, 2]
Черт, я бы даже согласился только на массив ключей, но все равно отсортировал по значению на входе:
['Derp', 'Herp', 'Foo', 'Asd', 'Qwe']
Ответы
Ответ 1
Вы могли бы попробовать это,
_.mapValues(_.invert(_.invert(obj)),parseInt);
Объект {Herp: 2, Asd: 5, Foo: 8, Qwe: 12, Derp: 17}
или
var obj = {Derp: 17, Herp: 2, Asd: 5, Foo: 8, Qwe: 12}
var result = _.reduceRight(_.invert(_.invert(obj)), function(current, val, key){
current[key] = parseInt(val);
return current;
},{});
Объект {Derp: 17, Qwe: 12, Foo: 8, Asd: 5, Herp: 2}
или Использование цепочки:
_.chain(obj).invert().invert().reduceRight(function(current, val, key){
current[key] = parseInt(val);
return current;
},{}).value()
Объект {Derp: 17, Qwe: 12, Foo: 8, Asd: 5, Herp: 2}
Примечание. Это зависит от того, как пользовательские свойства объектов браузера обычно не являются gurrantee в большинстве случаев.
Ответ 2
Это сработало для меня
o = _.fromPairs(_.sortBy(_.toPairs(o), 1).reverse())
Вот пример:
var o = {
a: 2,
c: 3,
b: 1
};
o = _.fromPairs(_.sortBy(_.toPairs(o), 1).reverse())
console.log(o);
<script src="https://cdn.jsdelivr.net/lodash/4.17.4/lodash.min.js"></script>
Ответ 3
Я боролся с подобной проблемой, и я смог решить ее, делая некоторые преобразования с lodash. Для вашей проблемы это будет:
let doo = {Derp: 17, Herp: 2, Asd: 5, Foo: 8, Qwe: 12};
let foo = _.chain(doo)
.map((val, key) => {
return { name: key, count: val }
})
.sortBy('count')
.reverse()
.keyBy('name')
.mapValues('count')
.value();
console.log(foo);
// Derp: 17, Qwe: 12, Foo: 8, Asd: 5, Herp: 2 }