Когда вы читаете значения или записываете значения в массив, вам нужно выполнить двухэтапный поиск: сначала найдите индекс внешнего массива, а затем найдите индекс внутреннего массива для требуемого значения. Чтобы назначить другое значение "foo"
вместо "14"
в вашем массиве, вы должны сделать:
array[1][4] = "foo";
Мы можем назвать двумерный массив, подобный этому, матрицей. Давайте немного выровняем массив и назовем «внешний индекс» значения row
, а «внутренний индекс» значения col
(для столбца).
const myMatrix = [
// 0 1 2 3 4 <-- columns
["2", "X", "8", "11", "15"], // 0
["1", "5", "X", "X", "14"], // 1
["X", "4", "7", "10", "13"], // 2
["X", "3", "6", "9", "12"], // 3
];
// ^
// |
// rows
Значение "2"
живет в row = 0
и col = 0
, а также
Значение "1"
живет в row = 1
и col = 0
Давайте назовем один набор индексов строк и столбцов вектором, так что
[0, 0]
становится вектором "2"
в myMatrix
, а также
[1, 0]
становится вектором "1"
в myMatrix
Нам понадобится вспомогательная функция, которая принимает матрицу и значение и сообщает нам вектор этого значения в матрице:
function vector(matrix, value) {
const row = matrix.findIndex((row) => row.includes(value));
const col = matrix[row].findIndex((v) => v === value);
return [row, col];
}
Наконец, нам понадобится функция, которая фактически переключает значения в матрице.
function switchVectorValues(matrix, valueA, valueB) {
const [rowA, colA] = vector(matrix, valueA);
const [rowB, colB] = vector(matrix, valueB);
matrix[rowA][colA] = valueB;
matrix[rowB][colB] = valueA;
return matrix;
}
Собрав все это вместе, мы получим следующий рабочий пример:
function vector(matrix, value) {
const row = matrix.findIndex((row) => row.includes(value));
const col = matrix[row].findIndex((v) => v === value);
return [row, col];
}
function switchVectorValues(matrix, valueA, valueB) {
// Todo: validate input. `matrix` must be a 2D array for example,
// otherwise `vector()` is going to break things
const [rowA, colA] = vector(matrix, valueA);
const [rowB, colB] = vector(matrix, valueB);
matrix[rowA][colA] = valueB;
matrix[rowB][colB] = valueA;
return matrix;
}
const myMatrix = [
["2", "X", "8", "11", "15"],
["1", "5", "X", "X", "14"],
["X", "4", "7", "10", "13"],
["X", "3", "6", "9", "12"],
];
console.log(
switchVectorValues(myMatrix, "1", "2")
)