web-dev-qa-db-ja.com

キーを失うことなく、値でオブジェクトをソートする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']
21
user1340531

あなたはこのように試すことができます、

_.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メソッドの使用:

_.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}

注:ほとんどの場合、ブラウザの通常のオブジェクトプロパティの順序は保証されません。

4
Raja Jaganathan

これは私のために働いた

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>
18
Nicolas Morew

私は同様の問題に苦しんでいて、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 }
9
frankies