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

时间:2015-09-02 09:46:11

标签: sorting key 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']

4 个答案:

答案 0 :(得分:18)

这对我有用

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>
{{1}}

答案 1 :(得分: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 }

答案 2 :(得分:4)

你可以尝试这样,

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

答案 3 :(得分:0)

Vanilla ES6版本

const obj = {
  a: 2,
  c: 3,
  b: 1
}

const sorted = Object.entries(obj)
  .sort((a, b) => a[1] <= b[1] ? -1 : 1)
  .reduce((acc, pair) => {
    acc[pair[0]] = pair[1]
    return acc
  }, {})

// Output: { b: 1, a: 2, c: 3 }

这还使您可以访问sort回调,从而可以对更深层的对象属性进行更精细的排序。