返回

Lodash sortBy() 降序排序:揭秘谜团,提供可靠解决方案

vue.js

Lodash sortBy() 降序排序:揭开神秘面纱

Lodash sortBy() 函数提供了根据指定属性对对象数组进行排序的便利方式。然而,当涉及到降序排序时,我们可能会遇到一些意想不到的问题。本文将深入探讨 sortBy() 函数在降序排序时的怪异行为,并提供可靠的解决方案。

问题:降序排序的困境

想象一下一个场景:我们有一个包含以下对象的数组:

[
  { id: 1, name: "John", age: 30 },
  { id: 2, name: "Mary", age: 25 },
  { id: 3, name: "Bob", age: 35 }
]

使用以下代码,我们希望将数组按 "age" 属性降序排序:

const sortedData = _.sortBy(data, ["age"], ["desc"]);

但奇怪的是,sortBy() 并没有按照降序排序,而是继续按照升序排序。这是怎么回事呢?

解决方案:反转排序顺序

sortBy() 函数接受一个排序参数数组,每个参数对应于要排序的属性以及可选的排序方向。默认情况下,排序方向为升序("asc")。要进行降序排序,我们需要使用取反函数。

方法 1:使用negate() 函数

我们可以使用 Lodash 的 negate() 函数来创建取反函数:

const sortedData = _.sortBy(data, ["age"], [_.negate(_.identity)]);

.identity() 函数返回其输入值,.negate() 函数对该函数进行取反,因此最终得到一个函数,当给定两个值时,返回较小的那个。

方法 2:使用比较函数

另一个选择是使用比较函数:

const sortedData = _.sortBy(data, ["age"], [function(a, b) {
  return b.age - a.age;
}]);

这个比较函数比较两个对象的年龄,并返回较大的那个。

结论

通过使用取反函数或比较函数,我们可以让 Lodash sortBy() 函数按照降序对数组进行排序。虽然 Stack Overflow 上讨论过这个问题,但本文提供了更深入的解释和实际代码示例。

常见问题解答

1. 为什么 sortBy() 不能直接支持 "desc" 参数?

虽然 Lodash 文档暗示可以使用 "desc" 参数,但它实际上并不被支持。

2. 还有其他方法可以对 Lodash 数组进行降序排序吗?

是的,可以使用 _.reverse() 函数来反转由 sortBy() 生成的已排序数组。

3. 为什么在降序排序时使用比较函数比取反函数更有效?

比较函数通常在性能上更有效,特别是当数据集较大时。

4. 我可以在使用 sortBy() 函数时混合升序和降序排序吗?

是的,你可以通过传递一个包含升序和降序排序方向的数组来实现这一点。

5. 降序排序适用于哪些实际场景?

降序排序适用于各种情况,例如按年龄或价格从高到低排序列表、按优先级从低到高排序任务。