Используйте стандартную функцию перемешивания, чтобы перетасовать соответствующие индексы . Затем l oop через строки, чтобы применить тот же порядок к фактическим значениям:
function shuffle(a) {
var j, x, i;
for (i = a.length - 1; i > 0; i--) {
j = Math.floor(Math.random() * (i + 1));
x = a[i];
a[i] = a[j];
a[j] = x;
}
return a;
}
function shuffle2dColumns(arr) {
let length = arr[0].length-2;
let indexes = shuffle([...Array.from({length}).keys()]);
for (let j = 0; j < arr.length; j++) {
let row = arr[j]
arr[j] = [row[0],
...indexes.map(i => row[1+i]),
row[length+1]];
}
return arr;
};
let pat = [["1", "a", "p", "x", "4"],
["2", "b", "q", "y", "5"],
["3", "c", "r", "z", "6"]];
shuffle2dColumns(pat);
for (let row of pat) console.log(row+"");
Так что length
должно соответствовать количеству столбцов, которые вы хотите перемешать. В этом случае это на 2 меньше общего числа столбцов.
В выражении arr[j] =
на столбцы, которые должны оставаться на месте, просто ссылаются по их индексу: так что в этом случае row[0]
и row[length+1]
представляют два крайних столбца. Остальное, посередине, заполнено синтаксисом ...
и основано на случайном порядке, примененном к индексам. У 1+i
есть 1+
, потому что диапазон перемешанных столбцов начинается с индекса 1.
Вот более обобщенная функция c, где вы можете указать диапазон столбцов, которые должны быть подчинены перетасовки. Другие столбцы не будут перемещаться.
function shuffle(a) {
var j, x, i;
for (i = a.length - 1; i > 0; i--) {
j = Math.floor(Math.random() * (i + 1));
x = a[i];
a[i] = a[j];
a[j] = x;
}
return a;
}
function shuffle2dColumns(arr, first, last) {
let length = last + 1 - first;
let indexes = shuffle([...Array.from({length}).keys()]);
for (let j = 0; j < arr.length; j++) {
let row = arr[j]
arr[j] = [...row.slice(0, first),
...indexes.map(i => row[first+i]),
...row.slice(last+1)];
}
return arr;
};
let pat = [["1", "a", "p", "x", "4"],
["2", "b", "q", "y", "5"],
["3", "c", "r", "z", "6"]];
shuffle2dColumns(pat, 0, 3); // Now also include column 0 in the shuffle
for (let row of pat) console.log(row+"");