使用 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]

原文由 Dave Kalu 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.4k
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>

原文由 Nina Scholz 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

但是,您可以使用 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() : 获取键数组

请参阅 有关 Map 的文档

原文由 jo_va 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题