Lodash按值排序对象,而不会丢失密钥

use*_*531 22 sorting key lodash

假设我有一个对象:

{Derp: 17, Herp: 2, Asd: 5, Foo: 8, Qwe: 12}
Run Code Online (Sandbox Code Playgroud)

我需要按价值对其进行排序.我想要得到的是:

{Derp: 17, Qwe: 12, Foo: 8, Asd: 5, Herp: 2}
Run Code Online (Sandbox Code Playgroud)

我想用它来做lodash.当我使用_.sortBy它时,不会保留密钥:

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

地狱,我甚至只满足于键数组,但仍然按输入中的值排序:

['Derp', 'Herp', 'Foo', 'Asd', 'Qwe']
Run Code Online (Sandbox Code Playgroud)

nic*_*sch 21

这对我有用

o = _.fromPairs(_.sortBy(_.toPairs(o), 1).reverse())
Run Code Online (Sandbox Code Playgroud)

这是一个例子:

var o = {
  a: 2,
  c: 3,
  b: 1
};
o = _.fromPairs(_.sortBy(_.toPairs(o), 1).reverse())
console.log(o);
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdn.jsdelivr.net/lodash/4.17.4/lodash.min.js"></script>
Run Code Online (Sandbox Code Playgroud)

  • 抬起头,这对我不起作用,我不得不改用坦率 (3认同)

fra*_*ies 9

我正在努力解决类似的问题,我能够用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 }
Run Code Online (Sandbox Code Playgroud)


Raj*_*han 5

你可以这样试试

_.mapValues(_.invert(_.invert(obj)),parseInt);
Run Code Online (Sandbox Code Playgroud)

对象 {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;
},{});
Run Code Online (Sandbox Code Playgroud)

对象 {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()
Run Code Online (Sandbox Code Playgroud)

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

注意:这取决于浏览器通常对象属性的顺序在大多数情况下不是 gurrantee。

  • 如果您有非唯一值,这将失败:P,结果对象中只有一个非唯一值 (11认同)