首页 > 解决方案 > 按两个字段排序,但第二个字段取决于 PHP 中的条件

问题描述

我有一个带有“商店”的数组,每个都有一个距离属性(与用户的距离)和一个“特色”属性(这个值越高,它们应该出现的越高)。

所以,现在我正在这样做:

var sorted = arr.sort(function(a,b){
    return b.featured - a.featured || a.distance - b.distance;
});

首先按特征排序,然后按距离排序。

但是,如果距离太远(例如,超过 10 公里),即使结果具有特色,也与用户无关。

所以,我需要首先对它们的“特色”属性进行排序,但前提是它们的距离属性小于 10。

我在想这个:

  1. 按距离对它们进行排序,将接近 10 公里的放在一个数组中,将其他的放在另一个数组中。

  2. 按其特征属性对第一个数组中的元素进行排序。

  3. 加入两个数组。

但也许有更简单或更短的方法来做到这一点。

样本输入:

d: 19  | f: 2
d: 2   | f: 8
d: 3   | f: 5
d: 21  | f: 4
d: 6   | f: 0
d: 12  | f: 5
d: 1   | f: 5
d: 8   | f: 4
d: 5   | f: 0
d: 13  | f: 5
d: 11  | f: 2
d: 7   | f: 1
d: 9   | f: 10

样本输出:

d: 9   | f: 10
d: 2   | f: 8
d: 1   | f: 5
d: 3   | f: 5
d: 8   | f: 4
d: 7   | f: 1
d: 5   | f: 0
d: 6   | f: 0
d: 11  | f: 2
d: 12  | f: 5
d: 13  | f: 5
d: 19  | f: 2
d: 21  | f: 4

如您所见,对于距离小于 10 的,它按特征值对其进行排序,但对于距离大于 10 的,它按距离对其进行排序。

标签: javascript

解决方案


如果我理解您的问题,您可以添加一个返回当前返回内容的条件,如果不满足该条件,则仅返回其中的距离部分:

var sorted = arr.sort(function(a,b){
    if (a.distance < 10000 || b.distance < 10000)
        return b.featured - a.featured || a.distance - b.distance;

    return a.distance - b.distance;
});

推荐阅读