Javascript - сортировка по массивам переменной длины - PullRequest
2 голосов
/ 30 октября 2019

Предположим, у меня есть массив опций для сортировки по нескольким оценкам, и эти оценки представляют собой массив переменной длины

[
  #[Label, scores]
  ["Label6", [1]
  ["Label5", [1,5]
  ["Label2", [0,1,3,5],
  ["Label1", [0,1,2]
  ["Label3", [0,1,4],
  ["Label4", [1,4]
]

Я хочу отсортировать этот список, оценивая элементы массива один за другим. IE. Сначала я отсортирую (по возрастанию) по score[0], затем score[i+1], если он существует, и т. Д. Когда score[i] не существует, его следует рассматривать как бесконечное значение (отображается внизу)

Это может дать следующий вывод на предыдущих данных:

list = [
  #[Label, scores]
  ["Label1", [0,1,2]  
  ["Label2", [0,1,3,5],
  ["Label3", [0,1,4],
  ["Label4", [1,4]
  ["Label5", [1,5]
  ["Label6", [1]
]

Как я могу написать эту функцию? Есть ли нативная / ES6 (или lodash / underscore) функция sortBy(), как у нас на других языках? (например, в Ruby вы бы просто list.sort_by(&:last) получили этот эффект). Или это нужно реализовывать вручную?

Ответы [ 2 ]

5 голосов
/ 30 октября 2019

Вы можете взять массивы и отсортировать их по одинаковым значениям индекса.

При запуске взять минимальную длину обоих массивов в качестве длины для итерации значений и предотвращения принятия undefined.

Если дельта двух значений одного и того же индекса не равна нулю, вернуть дельту, в противном случае перейти к следующему индексу.

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

var array = [["Label6", [1, 5]], ["Label2", [0, 1, 3, 5]], ["Label1", [0, 1, 2]], ["Label3", [0, 1, 4]], ["Label5", [1, 5, 2]], ["Label4", [1, 4]]];

array.sort(([, a], [, b]) => {
    var delta,
        index = 0,
        length = Math.min(a.length, b.length);

    while (index < length) {
        delta = a[index] - b[index];
        if (delta) return delta;
        index++;
    }

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

console.log(array);
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 30 октября 2019

Есть функция array.sort(), которая принимает алгоритм сортировки и сортирует массив для вас на основании этого. все, что вам нужно сделать, это реализовать сортировку только для 2 аргументов.

вот что я бы сделал в вашем случае:

list.sort( list1, list2 => {
  let i = 0, iterations = min(list1.length, list2.length);
  for( i = 0; i<iterations; i++ ){
    if( list1[i] < list2[i] ) return -1;
    if( list1[i] > list2[i] ) return 1;
  }
  if( list1.length === list2.length ) return 0;
  if( i === list1.length ) return -1;
  if( i === list2.length ) return 1;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...