我想在数组的多个列表中移动元素

时间:2019-06-08 07:20:57

标签: javascript arrays angularjs

我有这个数组

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 个答案:

答案 0 :(得分:2)

找到两者的外部数组索引和内部数组索引,然后切换它们:

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);

答案 1 :(得分:0)

您可以使用findIndex从各自的数组中找到21的第一个索引,然后将其替换。否则,如果您只想替换特定索引处的元素,则可以直接定位数组和索引并替换它

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)

答案 2 :(得分:0)

从样本来看,您似乎需要交替使用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"]

输出

a.forEach((item) => {

   if (item === "1")
      item = "2"
   else
      if (item === "2")
          item = "1"
})

您可以搜索每个数组,并使用forEach进行搜索。

State

答案 3 :(得分:0)

从数组中读取值或将值写入数组时,需要进行两步查找:首先找到外部数组索引,然后找到所需值的内部数组索引。要为数组中的"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 = 0col = 0处,并且
"1"位于row = 1col = 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")
)