为什么splice()表现得很奇怪?

时间:2017-02-07 17:42:50

标签: javascript

我正在尝试将多个数组压缩成一个并删除数组中的重复元素,以便从FCC进行练习。

具体来说,拼接方法在控制台中显示一件事但行为不同。谁能告诉我为什么splice()没有删除我用嵌套循环识别的重复项?

function uniteUnique(arr) {
  var arr1 = arguments; 
  newArr= [];

  for(var i=0; i<arr1.length; i++){
    for(var l=0; l<arr1[i].length; l++){
      newArr.push(arr1[i][l]);
    }
  }
  console.log(newArr);
  for(var t=0; t<newArr.length; t++){
    for(var p=0; p<newArr.length; p++){
      if(newArr[t]===newArr[p+1]){
      console.log("without splice ", newArr[p+1]);
      console.log("with splice ", newArr.splice(newArr[p+1],1))
        newArr.splice(newArr[p+1],1);
      }
    }
  }
  return newArr;
}

console.log(uniteUnique([1, 3, 2], [5, 2, 1, 4], [2, 1]));

将输出[4,1]。 但是应该输出[1,3,2,5,4]

第一次迭代日志: 没有拼接1 与splice [3]

第二 没有拼接1 与拼接[2]

第三 没有拼接2 与拼接[4]

第四: 没有拼接1 与拼接[2]

3 个答案:

答案 0 :(得分:1)

这里有三个错误:

  1. 此处无需使用p+1。只需使用p

  2. splice期望索引作为其第一个参数,但您将值视为要删除作为执行删除的索引。这没有意义。而不是.splice(newArr[p], 1),您需要.splice(p, 1)

  3. 您不会阻止某个值被视为潜在重复。如果if等于... && p!=t

    < LI>

答案 1 :(得分:0)

不建议在其循环中修改数组。如果您不必使用splice,只需创建一个全新的数组并通过搜索推送值,如果不存在则。

function uniteUnique() { 

  var newArr = [];
  for(var i=0; i<arguments.length; i++) { 
    var arr = arguments[i];
    for(var j=0; j<arr.length; j++) { 
      if(newArr.indexOf(arr[j]) == -1) { 
        newArr.push(arr[j]);
      } 
    } 
  } 

  return newArr;
} 

console.log(uniteUnique([1, 3, 2], [5, 2, 1, 4], [2, 1]));

答案 2 :(得分:0)

关于删除你的方法“就地”的重复项,splice工作正常并且你的算法几乎是好的,尝试在展平后调试迭代的每一步,以删除重复项。

你循环n平方次(因为p = t,你迭代p * t次)。 但是,有些东西没有做你想做的事情,看看这些:

if(newArr[t]===newArr[p+1]){ // HERE IT WON'T DO WHAT YOU WANT

除非你提到它,否则我不打算给出答案,我只是想证明问题不依赖于拼接本身,而不是你的算法。

您需要修改的另一行是

newArr.splice(newArr[p+1],1);

基本上,只要对这两行进行一些更改,您就可以达到删除重复项的目标。