javascript - 在 JavaScript 中编写对多个对象属性进行排序的排序方法的最简洁方法
问题描述
这是一种代码高尔夫/代码清洁度和简洁性问题。我有一个我想在 JavaScript 中排序的对象,我想知道最短和最干净的方法是什么。
给定这样的对象:
items = [
{name: "Pierre", boosted: true, rank: 1 },
{name: "Burhan", boosted: false, rank: null},
{name: "Ellise", boosted: false, rank: 1 },
{name: "Glenn", boosted: true, rank: 2 },
{name: "Zidane", boosted: false, rank: null},
{name: "Antonia", boosted: false, rank: 2 },
];
我需要对这些要求进行排序:
- 首先提升项目,然后
name
在多个提升项目中提升。 - 接下来放
rank
,升序,其中 rank != null。如果有平局,我们如何排序都没关系rank
。 - 当 rank = null 时,按
name
升序排序。
所以本质上是三个桶来对项目进行排序,然后在每个桶中按名称排序。排名未标准化,它可以是任何有效数字。
上面排序的结果列表应如下所示:
sorted = [
{name: "Glenn", boosted: true, rank: 2 },
{name: "Pierre", boosted: true, rank: 1 },
{name: "Ellise", boosted: false, rank: 1 },
{name: "Antonia", boosted: false, rank: 2 },
{name: "Burhan", boosted: false, rank: null},
{name: "Zidane", boosted: false, rank: null},
];
我写了这个长方法:
items.sort((a, b) => {
// Boosted
if (a.boosted && b.boosted) {
return a.name.localeCompare(b.name);
} else if (a.boosted && !b.boosted) {
return -1;
} else if (!a.boosted && b.boosted) {
return 1;
}
// Ranked
if (a.rank != null && b.rank != null) {
return a - b;
} else if (a.rank != null && b.rank == null) {
return -1;
} else if (a.rank == null && b.rank != null) {
return 1;
}
// Default by name
return a.name.localeCompare(b.name);
});
它有效,但我认为有更好的方法可以做到这一点,我很好奇其他人推荐什么风格。我能写的最短的解决方案是什么?什么最干净?最快的是什么?(因为在排序操作期间可能会多次调用 sort 方法)
解决方案
您可以-
在布尔值和数字上使用。您可以使用||
链接多个排序条件,当第一个不返回时短路0
。
在你的情况下,这可能是
items.sort((a, b) =>
b.boosted - a.boosted ||
(a.rank == null) - (b.rank == null) ||
a.rank - b.rank ||
a.name.localeCompare(b.name)
);
如果您只是按不同的优先列进行排序。但是,您有特殊要求,提升项目的排序方式应不同于非提升项目,因此您确实需要一个条件语句:
items.sort((a, b) =>
b.boosted - a.boosted ||
(a.boosted
? a.name.localeCompare(b.name)
: (a.rank == null) - (b.rank == null) ||
(a.rank != null
? a.rank - b.rank
: a.name.localeCompare(b.name)
)
)
);
推荐阅读
- ruby-on-rails - 在 MacOS 上安装 therubyracer 时未定义的局部变量或方法“make”
- spring - 带有 OAuth2 的 Spring Security 5 休息客户端
- arraylist - 为什么我的数字序列不能正确地从二维数组列表中打印出来?
- sql-server - SQL Server:带有日期的递归 CTE - 类型不匹配
- reactjs - 无法让 React Forwarded refs 在测试环境中工作
- html - 顺利加载消息Angular 8
- react-native - 此版本中使用了已弃用的 Gradle 功能,使其与 Gradle 6.0 不兼容。安装一些库时出错
- python-3.x - 按列名拼接 Pandas 数据框
- javascript - 为什么两个 if 语句在一个函数中不起作用?
- javascript - Javascript - 原始字符串隐式转换为对象