在将数组元素作为参数传递到 splice() 方法后,数组发生变异

Array gets mutated after array element is passed into splice() method as arguement

我正在尝试解决水连接问题

我有一个输入数组

const inputs = [
    [7, 4, 98],
    [5, 9, 72],
    [4, 6, 10],
    [2, 8, 22],
    [9, 7, 17],
    [3, 1, 66]
]

当我将该数组的内部数组的一个元素传递给 splice() 方法时,就像 newArray.splice(-2, 0, item[1]) 原始方法一样,input[item] 发生了变异。

这是完整的代码

const inputs = [
  [7, 4, 98],
  [5, 9, 72],
  [4, 6, 10],
  [2, 8, 22],
  [9, 7, 17],
  [3, 1, 66]
]

const starts = inputs.filter(element =>
  !(inputs.map(item => item[1]).includes(element[0]))
);

const arrayAppender = (array, element) => {
  const newArray = element;
  let elementAdd;
  let traversalDone = false;
  while (!traversalDone) {
    elementAdd = false;
    array.some(item => {
      if (newArray[newArray.length - 2] === item[0]) {
        newArray.splice(-1, 0, item[1]);
        newArray[newArray.length - 1] = newArray[newArray.length - 1] > item[2] ? item[2] : newArray[newArray.length - 1];
        elementAdd = true;
        return true;
      }
    })
    if (!elementAdd) traversalDone = true;
  }
  return newArray;
}

console.log(starts.sort().length);

starts.forEach((element, index) => {
  starts[index] = arrayAppender(inputs, element);
  console.log(starts[index][0], starts[index][starts[index].length - 2], starts[index][starts[index].length - 1]);
});

执行结束时inputs[1][5, 9, 72]变为[5, 9, 7, 4, 6, 10]

当我试图查看导致更改的原因时,newArray.splice(-1, 0, item[1]) ;这行代码触发了它(使用调试器找到)。

代码正在运行并且正在执行它应该执行的操作,但我非常想知道是什么导致了上述奇怪的行为以及如何解决这个问题。

提前致谢。

starts 数组是新数组,但它只有内部数组的引用,如 [7, 4, 98],您在 arrayAppender 函数中将其作为 element parameter 传递,然后用 new variable newArray 引用。所以这部分你可以使用 spread operator 修改如下。

const arrayAppender = (array, element) => {
  const newArray = [...element]; // spread operator to create new array
  // your code......
};