使用 lodash 按值对对象进行排序

Dav*_*alu 5 javascript arrays sorting lodash

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

var unsorted = {a: 15, b: 1,c: 2, d: 4, e: 3, f: 6, g: 1}
Run Code Online (Sandbox Code Playgroud)

我有兴趣使用 lodash 按降序对其进行排序,因此预期结果应该是:

var sortd = {b: 1, g: 1,c: 2, e: 3, d: 4, f: 6, a: 15}
Run Code Online (Sandbox Code Playgroud)

我曾尝试使用 lodash,orderBy但它给出了一个只包含排序值的数组。

_.orderBy(tempCount, Number, ['desc'])

//Result
[1,1,2,3,4,6,15]
Run Code Online (Sandbox Code Playgroud)

jo_*_*_va 8

JavaScript不保证对象中键的顺序,这就是 lodash 返回一个数组的原因,因为不能保证具有有序键的对象。看到这个问题

但是,您可以使用 a 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);
}
Run Code Online (Sandbox Code Playgroud)

您有多种方法可以迭代生成的地图的内容:

  • map.values(): 获取值数组
  • map.entries():得到的数组[key, value]
  • map.keys(): 获取一组键

请参阅关于 Map 的文档


Nin*_*olz 7

您可以使用排序的键/值对构建一个新对象。

实际标准或属性顺序:

  • 像键一样先对索引进行排序,按顺序
  • 保持所有其他键的插入顺序

要完全控制顺序,请使用带有键的数组并将其作为值的排序访问器。

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);
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
Run Code Online (Sandbox Code Playgroud)

_.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);
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
Run Code Online (Sandbox Code Playgroud)