Сортировка массива по заданному индексу - PullRequest
2 голосов
/ 04 октября 2019

Предположим, у меня есть простой массив

const simpleArray = [1, 2, 3, 4, 5];

В случае, например, я хочу создать карусель и соединить точки, чтобы щелкнуть события в Vue или React. Таким образом, нажав на точку, я хочу отсортировать массив так, чтобы первым слайдом был слайд с индексом точки. Следовательно, если индекс точки равен 3 - мой массив должен выглядеть следующим образом

const updatedSimpleArray = [3, 4, 5, 1, 2];

С этой идеей я пришел к выводу о создании этого метода.

const sortedArray = (pos) =>  {

  // pos is the dot index of the dot
  // if index is 1 - simply sort the array
  if ( pos == 1 ) return arr.sort();

  // otherwise - create two separate arrays and concat them
  const firstArr = arr.filter(el => el >= pos);
  const secondArr = arr.filter(el => el < pos);
  const newArr = [...firstArr, ...secondArr];
  return newArr;
}

Чтовы думаете о моем подходе и сложности времени / памяти? Вы бы использовали другой подход?

РЕДАКТИРОВАТЬ

Есть проблема, если мой массив не отсортирован. Если это выглядит так

const array = [4, 5, 1, 2, 3]

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

Ответы [ 3 ]

3 голосов
/ 04 октября 2019

Вы можете сделать как, удалить элементы из вашего index до length массива и толкнуть его к началу того же массива

    const array = [1, 2, 3, 4, 5];
    const index = 2;
    array.unshift(...array.splice(index))
    
    console.log(array)
1 голос
/ 04 октября 2019

Объединив знания из ответа Хариша, я переработал алгоритм. Теперь он работает с обоими примерами, где массивы могут выглядеть следующим образом.

const array1 = [1, 2, 3, 4, 5]
const array2 = [4, 5, 1, 2, 3]

Итак, здесь идет функция

const sortedArray = (pos) =>  {
  // First of all - sort the array
  const newArr = arr.sort((a, b) => a - b);

  // and then splice it and add this part to the start of the array
  newArr.unshift(...newArr.splice(pos-1));
  return newArr;
}
1 голос
/ 04 октября 2019

Вы можете получить индекс текущего значения точки. Затем создайте массив с 2 итерациями исходного массива, используя [...array, ...array]. Для данного массива это будет выглядеть как [1, 2, 3, 4, 5, 1, 2, 3, 4, 5]. Затем используйте slice, чтобы получить array.length предметы, начиная с index

function getRotation(array, value) {
  const index = array.indexOf(value);
  return [...array, ...array].slice(index, index + array.length)
}

console.log(getRotation([1, 2, 3, 4, 5], 3))
console.log(getRotation([1, 2, 3, 4, 5], 5))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...