Я хочу переместить элементы в нескольких списках массивов вокруг - PullRequest
2 голосов
/ 08 июня 2019

У меня есть этот массив

0: (5) ["2", "X", "8", "11", "15"] 
1: (5) ["1", "5", "X", "X", "14"]
2: (5) ["X", "4", "7", "10", "13"]
3: (5) ["X", "3", "6", "9", "12"]

Я хочу переместить цифру 1 в положение, где находится цифра 2, чтобы этот массив возвращал

0: (5) ["1", "X", "8", "11", "15"]
1: (5) ["2", "5", "X", "X", "14"]
2: (5) ["X", "4", "7", "10", "13"]
3: (5) ["X", "3", "6", "9", "12"]

Эта коллекция массивов возвращается сразу, поэтому я хотел бы изменить позицию после ее возвращения.

Я использую JavaScript. Спасибо всем.

Я пытался

Array.prototype.move = function (from, to) {
this.splice(to, 0, this.splice(from, 1)[0]);
};

Но это перемещает всю строку друг с другом, т.е. перемещает массив 0 в массив 1

Ответы [ 4 ]

2 голосов
/ 08 июня 2019

Найдите индекс внешнего массива и индекс внутреннего массива обоих, затем переключите их:

const input = [
 ["2", "X", "8", "11", "15"] ,
 ["1", "5", "X", "X", "14"],
 ["X", "4", "7", "10", "13"],
 ["X", "3", "6", "9", "12"]
];

const getLoc = char => {
  const arrIndex = input.findIndex(subarr => subarr.includes(char));
  const subArrIndex = input[arrIndex].indexOf(char);
  return [arrIndex, subArrIndex];
};
const move = (char1, char2) => {
  const [loc1, loc2] = [char1, char2].map(getLoc);
  
  [
    // switch position of first character:
    input[loc1[0]][loc1[1]],
    // and position of second character:
    input[loc2[0]][loc2[1]]
  ] = [
    // with position of second character:
    input[loc2[0]][loc2[1]],
    // and the first character:
    input[loc1[0]][loc1[1]]
  ];
};

move('2', '1');
console.log(input);
0 голосов
/ 08 июня 2019

Когда вы читаете значения или записываете значения в массив, вам нужно выполнить двухэтапный поиск: сначала найдите индекс внешнего массива, а затем найдите индекс внутреннего массива для требуемого значения. Чтобы назначить другое значение "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")
)
0 голосов
/ 08 июня 2019

Судя по вашему образцу, похоже, что вам нужно чередовать 1 и 2.

Введите

0: (5) ["2", "X", "8", "11", "15"] 
1: (5) ["1", "5", "X", "X", "14"]
2: (5) ["X", "4", "7", "10", "13"]
3: (5) ["X", "3", "6", "9", "12"]

выход

0:(5) ["1", "X", "8", "11", "15"]
1: (5) ["2", "5", "X", "X", "14"]
2: (5) ["X", "4", "7", "10", "13"]
3: (5) ["X", "3", "6", "9", "12"]

Вы можете искать в каждом массиве и делать это, используя forEach.

a.forEach((item) => {

   if (item === "1")
      item = "2"
   else
      if (item === "2")
          item = "1"
})
0 голосов
/ 08 июня 2019

Вы можете использовать findIndex, чтобы найти первый индекс 2 и 1 из соответствующего массива, а затем заменить его. Иначе, если вы хотите заменить элемент только по определенному индексу, вы можете напрямую нацелить массив и индекс и заменить его

let data = [
  ["2", "X", "8", "11", "15"],
  ["1", "5", "X", "X", "14"]
];


let find2In1 = data[0].findIndex(item => item === "2");
let find1In2 = data[1].findIndex(item => item === "1");
data[0][find2In1] = "1";
data[1][find1In2] = "2";

console.log(data)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...