Lodash 按值排序对象,而不会丢失键
Lodash sorting object by values, without losing the key
假设我有一个对象:
{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']
你可以这样试试,
_.mapValues(_.invert(_.invert(obj)),parseInt);
Object {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;
},{});
Object {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()
Object {Derp: 17, Qwe: 12, Foo: 8, Asd: 5, Herp: 2}
注意:这取决于浏览器通常对象属性顺序在大多数情况下是不保证的。
我一直在努力解决类似的问题,但我能够通过使用 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 }
这对我有用
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>
香草 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 }
这还允许您访问排序回调,允许对更深层次的对象属性进行更精细的排序。
假设我有一个对象:
{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']
你可以这样试试,
_.mapValues(_.invert(_.invert(obj)),parseInt);
Object {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;
},{});
Object {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()
Object {Derp: 17, Qwe: 12, Foo: 8, Asd: 5, Herp: 2}
注意:这取决于浏览器通常对象属性顺序在大多数情况下是不保证的。
我一直在努力解决类似的问题,但我能够通过使用 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 }
这对我有用
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>
香草 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 }
这还允许您访问排序回调,允许对更深层次的对象属性进行更精细的排序。