sorting - example - lodash pluck
Lodash clasifica objetos por valores, sin perder la llave. (3)
Digamos que tengo un objeto:
{Derp: 17, Herp: 2, Asd: 5, Foo: 8, Qwe: 12}
Y necesito ordenarlo por valor. Lo que estoy buscando para obtener es:
{Derp: 17, Qwe: 12, Foo: 8, Asd: 5, Herp: 2}
Me gustaría usar lodash para ello. Cuando uso _.sortBy
, no conserva las claves como nunca:
_.sortBy({Derp: 17, Herp: 2, Asd: 5, Foo: 8, Qwe: 12}).reverse();
// [17, 12, 8, 5, 2]
Demonios, incluso me conformaría con el conjunto de teclas, pero aún así ordenado por el valor en la entrada:
[''Derp'', ''Herp'', ''Foo'', ''Asd'', ''Qwe'']
Estaba luchando contra un problema similar y pude resolverlo haciendo algunas transformaciones con lodash. Para tu problema sería:
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 }
Esto funciono para mi
o = _.fromPairs(_.sortBy(_.toPairs(o), 1).reverse())
Aquí hay un ejemplo:
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>
Podrías intentarlo así,
_.mapValues(_.invert(_.invert(obj)),parseInt);
Objeto {Herp: 2, Asd: 5, Foo: 8, Qwe: 12, Derp: 17}
o
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;
},{});
Objeto {Derp: 17, Qwe: 12, Foo: 8, Asd: 5, Herp: 2}
o utilizando métodos de cadena:
_.chain(obj).invert().invert().reduceRight(function(current, val, key){
current[key] = parseInt(val);
return current;
},{}).value()
Objeto {Derp: 17, Qwe: 12, Foo: 8, Asd: 5, Herp: 2}
Nota: Depende del navegador, por lo general, el orden de las propiedades del objeto no se garantiza en la mayoría de los casos.