我有一个看起来像这样的对象:
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]
答案 0 :(得分:3)
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()
:获取键数组答案 1 :(得分:2)
您可以使用已排序的键/值对构建新对象。
实际标准或属性顺序:
要完全控制订单,请使用带有键的数组,并将其作为值的排序访问器。
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>
答案 2 :(得分:0)
这里您有另一种方法(不带破折号)。基本上,我们使用[[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);