Сортировка по двум полям, но второе зависит от условия в PHP

#javascript

#javascript

Вопрос:

У меня есть массив с «магазинами», каждый из которых имеет свойство distance (расстояние от пользователя) и свойство «featured» (чем выше это значение, тем выше они должны отображаться).

Итак, прямо сейчас я делаю это:

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

Которое сортирует сначала по признакам, а затем по расстоянию.

Однако, если расстояние слишком велико (например, более 10 км), даже если результат показан, это не имеет значения для пользователя.

Итак, мне нужно сначала отсортировать их по свойству «featured», но только если их свойство distance меньше 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, он сортирует их по расстоянию.

Комментарии:

1. пожалуйста, добавьте пример ввода и ожидаемый результат.

Ответ №1:

Если я понимаю ваш вопрос, вы можете просто добавить условие, которое возвращает то, что вы возвращаете в данный момент, и если это условие не выполнено, верните только его часть distance:

 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;
});
  

Комментарии:

1. Не сработало :/ Я добавил входные данные и ожидаемый результат в сообщение, хотя