#javascript #arrays #sorting
Вопрос:
надеюсь, вы поможете мне это исправить.
Итак, у меня есть один массив с вложенными массивами:
mainArr: [[Carl, 20, Male],[Mike, 30, Male], [Chloe, 45, Female], ...]
Теперь этот массив необходимо отсортировать по другому массиву, содержащему заданный порядок индексов из приведенного выше массива.
indexArr: [2,1,3,...]
Результатом здесь является:
sortedArr: [[Mike, 30, Male], [Carl, 20, Male], [Chloe, 45, Female], ...]
Я подумал о том, чтобы написать цикл ForEach со вторым массивом, что-то вроде:
indexArr.forEach(i){ sortedArr.push(mainArr[indexArr[i]]); };
Но я стараюсь избегать использования циклов с этой функцией, чтобы она работала быстро. Я не смог найти ничего, относящегося к моей проблеме, ни в одной документации по массиву. Знаете ли вы способ эффективно заполнить sortedArr или отсортировать mainArr?
Комментарии:
1. Не думайте, что есть что-то быстрее, чем ваш цикл forEach
2. Вы не можете сделать это без перебора записей в массиве (будь то явный цикл for/foreach или неявный цикл, такой как map).
Ответ №1:
indexArr.map(ind =gt; mainArr[ind - 1])
Комментарии:
1. Идеально, надо было об этом подумать! Большое спасибо
2. хороший ответ с использованием цикла, который необходим
3. Каждое чтение с массивом позиций, например
const item = mainArr[sortArr[index]]
, будет иметь постоянное количество шагов (O(1)
сложность). Тем не менее, вам нужно будет пройти весь массив, чтобы собрать все элементы, действие, количество шагов которого увеличивается по мере увеличения количества элементов (O(n)
сложность, которую вы пытаетесь отменить). В этом смысле я не вижу выхода из цикла для получения всех необходимых вам элементов, независимо от используемого метода массива (например, этоmap
не позволит избежать перебора элементов), без разницы в сложности —push
или этот подход будет O(1).4. Я понял, что ты прав, в этом нет никакого способа избежать петли. Это должно сработать!