用lodash按值对对象排序

时间:2019-02-04 16:58:50

标签: javascript arrays sorting lodash

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

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]

3 个答案:

答案 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():获取键数组

请参见the doc about Map

答案 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);