我有一个对象,看起来像这样:
var unsorted = {a: 15, b: 1,c: 2, d: 4, e: 3, f: 6, g: 1}
而我感兴趣的排序它与lodash降序排列,所以预期的结果应该是:
var sortd = {b: 1, g: 1,c: 2, e: 3, d: 4, f: 6, a: 15}
我一直在使用lodash orderBy
尝试,但它给刚刚整理值的数组。
_.orderBy(tempCount, Number, ['desc'])
//Result
[1,1,2,3,4,6,15]
你可以建立与排序的键/值对的新对象。
实际的标准或属性的顺序:
用于通过顺序的完全控制,取与键阵列的把它作为排序的访问器的值。
var unsorted = { a: 15, b: 1,c: 2, d: 4, e: 3, f: 6, g: 1 },
sorted = _(unsorted)
.toPairs()
.orderBy([1], ['desc'])
.fromPairs()
.value()
console.log(sorted);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
使用最后一个参数为一个特定的顺序降序排序与_.orderBy
,而不是_.sortBy
,只允许升序排序。
var unsorted = { a: 15, b: 1,c: 2, d: 4, e: 3, f: 6, g: 1 },
sorted = _(unsorted)
.toPairs()
.orderBy(1, 'desc')
.fromPairs()
.value()
console.log(sorted);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
JavaScript不保证键的顺序中的对象,这就是为什么lodash将返回一个数组,因为下令密钥的对象不能保证。看到这个SO question。
但是你可以使用一个Map
,它不保证该键的顺序。
你可以用纯JavaScript做到这一点:
const unsorted = { a: 15, b: 1,c: 2, d: 4, e: 3, f: 6, g: 1 };
const sorted = new Map(Object.entries(unsorted).sort((a, b) => a[1] - b[1]));
for (const [key, val] of sorted) {
console.log(key, val);
}
你有多种方式来遍历生成的地图的内容:
map.values()
:获取值的数组map.entries()
:获得[key, value]
对数组map.keys()
:拿到钥匙的数组在这里,你有另一种方法(不lodash)。基本上,我们创建和类型的阵列[[key1, value1], [key2, value2],...]
使用Object.entries(unsorted)
,那么那种阵列(上升/下降)比较values
,最终再次构造对象的结构,必须最初,第一映射对[key, value]
对象{key: value}
然后,指派所有这些对象一个新的使用Object.assign()
。
var unsorted = {a: 15, b: 1,c: 2, d: 4, e: 3, f: 6, g: 1};
let sortedAsc = Object.entries(unsorted)
.sort(([k1,v1], [k2,v2]) => v1 - v2)
.map(([x,y]) => ({[x]:y}));
let sortedDesc = Object.entries(unsorted)
.sort(([k1,v1], [k2,v2]) => v2 - v1)
.map(([x,y]) => ({[x]:y}));
let objSortedAsc = Object.assign({}, ...sortedAsc);
let objSortedDesc = Object.assign({}, ...sortedDesc);
console.log("ASC: ", objSortedAsc, "DESC: ", objSortedDesc);