javascript - 根据 {liked :true} 、距离然后按 avg_rating 对数组对象进行多重排序
问题描述
我有一个数组对象如下
arr = [ {distance:4, avg_rating: 5},
{distance: 6, avg_rating: 4},
{distance: 7, avg_rating: 2, liked: true},
{distance: 6, avg_rating: 4 , liked: true},
{distance: 6, avg_rating: 3 , liked: true},
{distance: 4, avg_rating: 3}]
我希望首先得到 {liked: true} 然后它会按距离升序排序,如果距离相同,那么它将根据 avg_rating 排序。
我使用了不工作的 javascript 排序方法。
arr.sort(function(a, b){
if (b.liked) return 1;
if(!b.liked) return -1;
if (a.distance < b.distance) return 1;
if (a.distance > b.distance) return -1;
if (a.avg_rating < b.avg_rating) return -1;
if (a.avg_rating > b.avg_rating) return 1;
})
我希望结果是
arr = [{distance: 6, avg_rating: 4 , liked: true},
{distance: 6, avg_rating: 3 , liked: true}
{distance: 7, avg_rating: 2, liked: true},
{distance: 4, avg_rating: 5},
{distance: 4, avg_rating: 3},
{distance: 6, avg_rating: 4}]
因此,首先所有 { like : true } 都在顶部并按距离按升序排序(即所有附近都在数组顶部),然后如果距离相同,则按 avg_rating 按降序排序(即所有相同的距离值是再次按 avg_rating 排序)
解决方案
您可以通过获取每个项目的增量来链接所有条件并获得所需的订单。
对于第一对,取一个逻辑 NOT!
以获得一个布尔值进行减法。
其他的按照排序的顺序,a - b
(asc)和b - a
(desc)。
var array = [{ distance: 4, avg_rating: 5 }, { distance: 6, avg_rating: 4 }, { distance: 7, avg_rating: 2, liked: true }, { distance: 6, avg_rating: 4, liked: true }, { distance: 6, avg_rating: 3, liked: true }, { distance: 4, avg_rating: 3 }];
array.sort((a, b) =>
!a.liked - !b.liked ||
a.distance - b.distance ||
b.avg_rating - a.avg_rating
);
console.log(array);
.as-console-wrapper { max-height: 100% !important; top: 0; }
推荐阅读
- c - 如何使这项工作适用于 3 个用户并通过而不是 1 C
- angular - 带有参数的特定路由的用户访问
- python - 通过硒,Python中的xpath检测用户可见元素(仅在视口中)
- c# - 如何让 C# 中的按钮上显示的文本?
- reactjs - 动作类型说明
- mysql-python - 如何在 Python 2.6 中使用 mysql.connector
- swift - 在 SpriteKit swift4 Xcode 中停止一个动作并设置一个定时器来切换玩家
- r - 根据列名和因子将数据从一个数据框收集到另一个数据框
- android - getUserConfirmation 不起作用反应本机
- directory - 我在哪里可以找到星际争霸II 中的地图文件夹?