通过lodash值排序对象

问题描述 投票:3回答:3

我有一个对象,看起来像这样:

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]
javascript arrays sorting lodash
3个回答
3
投票

你可以建立与排序的键/值对的新对象。

实际的标准或属性的顺序:

  • 排序索引像钥匙首先,为了
  • 保持订单中的所有其他键

用于通过顺序的完全控制,取与键阵列的把它作为排序的访问器的值。

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>

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():拿到钥匙的数组

the doc about Map


0
投票

在这里,你有另一种方法(不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);
© www.soinside.com 2019 - 2024. All rights reserved.