Как узнать в какую сторону отсортируется массив функцией sort(fn)

142
26 мая 2021, 21:50

Есть функция sort(fn). Как не проверяя результат, узнать в какую сторону сортируется массив (увеличение или уменьшение)?

let d = [1, 2, 4, 5, 7, 15, 10, 3, 0,] 
 
console.log( d.sort( (a, b) => { 
  if(a > b){ 
    return 1 //  предполагаю в сторону увеличения  
  } 
} ) );

let d = [1, 2, 4, 5, 7, 15, 10, 3, 0,] 
 
console.log( d.sort( (a, b) => { 
  if(a < b){ 
    return -1 //  предполагаю в сторону уменьшения  
  } 
} ) );

Answer 1

Обновил ответ

При сортировке, ф-я sort() определяет позицию индекса для элементов с помощью вызова функции сравнения, переданного ей в качестве агрумента, которая принимает два параметра a и b.

Если вызванная ф-я сравнения, для переданных аргументов, возвращает значения:

  • больше 0 - значит индекс элемента, в отсортированном массиве, для аргумента a будет больше чем у b
  • меньше 0 - значит индекс элемента, в отсортированном массиве, для аргумента a будет меньше чем у b
  • 0 - аргументы равны и в текущей итерации изменение значения индекса производится не будет.

Отсортировать по возрастанию:

let d = [1, 2, 4, 5, 7, 15, 10, 3, 0,]
console.log( d.sort( (a, b) => {
  return a - b;
} ) );
Результат: [0, 1, 2, 3, 4, 5, 7, 10, 15]

Отсортировать по убыванию:

let d = [1, 2, 4, 5, 7, 15, 10, 3, 0,]
console.log( d.sort( (a, b) => {
  return b - a;
} ) );
Результат: [15, 10, 7, 5, 4, 3, 2, 1, 0]

Для таких простых сортировок по одному вызову ф-и, можно определить порядок сортировки:

if (fn(1, 2) > 0) {
  console.log("По возвраствнию");
} else {
  console.log("По убыванию");
}

Но алгоритм для сортировки может быть непростыми, например такой - в отсортированном массиве вначале идут четные значения по-возрастанию, а после - нечетные по-убыванию:

let d = [1, 2, 4, 5, 7, 15, 10, 3, 0,]
console.log( d.sort( (a, b) => {
  if (a === b ) {
    return 0;
  } else if (a % 2 === 0) {
    if (b % 2 === 0) {
        return a - b
    } else {
        return -1
    }
  } else {
     if (b % 2 !== 0) {
        return b - a ;
    } else {
        return 1
    }
  }
} ) );
Результат:  [0, 2, 4, 10, 15, 7, 5, 3, 1]

Для последней сортировки, не зная точно алгоритма сортировки, врядли у вас получится по одному вызову определить направление ;)

READ ALSO
Jquery UI draggable stop: поймать элемент который находится под тем,который перетягивают

Jquery UI draggable stop: поймать элемент который находится под тем,который перетягивают

Собственно говоря, вопрос в заголовкеЧто я хочу сделать, но не знаю как: при срабатывании event stop получить элемент, над которым отпустили блок,...

111
Как произвольно разбить &lt;ul&gt; на columns?

Как произвольно разбить <ul> на columns?

Всем привет! Обычным способом можно разбить "ul" на columns, прописав в стилях списка "columns: 3"Он сделает 3 колонки, по 2 "li" в каждой

116
Модульные css и глобальные классы

Модульные css и глобальные классы

Как переопределить в module scss глобальный класс officeUI fabric?

132
Зачем удалять динамические массивы, и что будет если их не удалять?

Зачем удалять динамические массивы, и что будет если их не удалять?

нам в универе сказали, что мы обязаны постоянно удалять массивы, если они динамические, но я так и не понял зачем и почемуВот, например, код...

95