我没有拼接的变量正在拼接

时间:2018-09-16 20:20:11

标签: javascript arrays

我正在尝试制作一个接受数组的函数,并打印缺少一个数字的数组版本。例如,如果数组为[1,2,3],它将打印[2,3][1,3][1,2]。因此,我要创建一个变量tempSeq,将其设置为等于Sequence,用Document.write()打印,然后将tempSeq重置为原始sequence。但是由于某种原因,变量sequence被拼接了。不知道为什么会这样,将不胜感激!

function almostIncreasingSequence(sequence) {
  var tempseq = sequence;
  for (let i = 0; i < sequence.length; i++) {
    tempseq = sequence;
    tempseq.splice(i, 1);
    document.write("(" + tempseq + ")");
  }
  return tempseq;
}

almostIncreasingSequence([10, 1, 2, 3, 4, 5]);

函数名称很奇怪,因为最终该函数还会执行其他操作。

2 个答案:

答案 0 :(得分:2)

此行实际上是在说“将“序列”数组也称为“ tempseq””

var tempseq = sequence;

,这并不是说将“序列”数组克隆到“ tempseq”中(如果您期望这种行为)。然后拼接实际上在sequence数组上进行操作

tempseq.splice(i, 1); // equal to sequence.splice(i, 1)

只需克隆数组:

// instead of
// var tempseq = sequence;
var tempseq = sequence.slice();

function almostIncreasingSequence(sequence) {
  var tempseq = sequence.slice();
  for (let i = 0; i < sequence.length; i++) {
    tempseq = sequence;
    tempseq.splice(i, 1);
    document.write("(" + tempseq + ")");
  }
  return tempseq;
}

almostIncreasingSequence([10, 1, 2, 3, 4, 5]);

答案 1 :(得分:0)

当您分配tempseq =序列tempseq仍然是同一数组时,它只是一个引用,因此拼接会同时影响两者。使用reduce可以创建数组的副本,而不在i处添加项目

function almostIncreasingSequence(sequence) {
  var tempseq = sequence;
  for (let i = 0; i < sequence.length; i++) {
    const tempseq = sequence.reduce((results, item, index) => index === i ? results : [...results, item], []);
    document.write("(" + tempseq + ")");
  }
  return tempseq;
}

almostIncreasingSequence([10, 1, 2, 3, 4, 5]);