web-dev-qa-db-fra.com

Lodash trie l'objet par valeurs, sans perdre la clé

Disons que j'ai un objet:

{Derp: 17, Herp: 2, Asd: 5, Foo: 8, Qwe: 12}

Et je dois le trier par valeur. Ce que je cherche à obtenir, c'est:

{Derp: 17, Qwe: 12, Foo: 8, Asd: 5, Herp: 2}

Je voudrais utiliser lodash pour cela. Lorsque j'utilise _.sortBy il ne conserve cependant pas les clés:

_.sortBy({Derp: 17, Herp: 2, Asd: 5, Foo: 8, Qwe: 12}).reverse();
// [17, 12, 8, 5, 2]

Enfer, je me contenterais même du tableau de clés, mais toujours trié par la valeur en entrée:

['Derp', 'Herp', 'Foo', 'Asd', 'Qwe']
21
user1340531

Vous pourriez essayer comme ça,

_.mapValues(_.invert(_.invert(obj)),parseInt);

Objet {Herp: 2, Asd: 5, Foo: 8, Qwe: 12, Derp: 17}

ou

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;
},{});

Objet {Derp: 17, Qwe: 12, Foo: 8, Asd: 5, Herp: 2}

ou en utilisant des méthodes de chaîne:

_.chain(obj).invert().invert().reduceRight(function(current, val, key){ 
    current[key] = parseInt(val);
    return current;
},{}).value()

Objet {Derp: 17, Qwe: 12, Foo: 8, Asd: 5, Herp: 2}

Remarque: Cela dépend du navigateur, généralement, l'ordre des propriétés des objets n'est pas garanti dans la plupart des cas.

4
Raja Jaganathan

Je luttais avec un problème similaire et j'ai pu le résoudre en faisant des transformations avec lodash. Pour votre problème ce serait:

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 }
9
frankies