Перемешать массив после определенного индекса - PullRequest
0 голосов
/ 14 июля 2020

Я понимаю, что правильный подход к перетасовке массива в ES6 следующий:

function shuffle(a) {
    for (let i = a.length - 1; i > 0; i--) {
        const j = Math.floor(Math.random() * (i + 1));
        [a[i], a[j]] = [a[j], a[i]];
    }
    return a;
}

Однако, если бы я хотел перетасовать свой массив после определенного индекса, как бы я это сделал (т.е. только перемешать элементы от индекса 2 до последнего индекса).

Ответы [ 4 ]

2 голосов
/ 14 июля 2020

Вы можете создать функцию shuffleArray, которая принимает:

  • массив;
  • начальный индекс (значение по умолчанию: 0).

function shuffleArray(array, startingIndex = 0) {
  for (let currentIndex = startingIndex; currentIndex < array.length; currentIndex++) {
    let randomIndex = startingIndex + (Math.floor(Math.random() * (array.length - startingIndex)));
    let tempValue = array[currentIndex];
    array[currentIndex] = array[randomIndex];
    array[randomIndex] = tempValue;
  }
  return array;
}

// Used like so
let array = [0, 1, 2, 3, 4];
let startingIndex = 2;
shuffleArray(array, startingIndex);
console.log(array);
2 голосов
/ 14 июля 2020
function shuffle(a) {
    for (let i = a.length - 1; i > 0; i--) {
        const j = Math.floor(Math.random() * (i + 1));
        [a[i], a[j]] = [a[j], a[i]];
    }
    return a;
}

function shuffleFromIndex(a, index) {
    let arr = a.slice(index);
    let baseArr = a.slice(0, index);
    return [...baseArr, ...shuffle(arr)]
}
2 голосов
/ 14 июля 2020

Не знаю, хотите ли вы этого, но думаю, работает

function shuffle(a) {
    for (let i = a.length - 1; i > 0; i--) {
        const j = Math.floor(Math.random() * (i + 1));
        [a[i], a[j]] = [a[j], a[i]];
    }
    return a;
}

function shuffleAfter(a, index = 0) {
  const left = a.slice(0, index + 1);
  const right = a.slice(index + 1);
  return [...left, ...shuffle(right)];
}

console.log(shuffleAfter([0, 1, 2], 0));
console.log(shuffleAfter([0, 1, 2, 3], 1));
console.log(shuffleAfter([0, 1, 2, 3, 4], 2));
console.log(shuffleAfter([0, 1, 2, 3, 4, 5], 3));
0 голосов
/ 14 июля 2020

Используя ваш метод:

function shuffle(a) {
    for (let i = a.length - 1; i > 0; i--) {
        const j = Math.floor(Math.random() * (i + 1));
        [a[i], a[j]] = [a[j], a[i]];
    }
    return a;
}

const arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
const position = 2
const shuffled = [...arr.slice(0, position), ...shuffle(arr.slice(position))]

console.log(`[${arr.toString()}] ==> [${shuffled.toString()}]`)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...