Javascript 为什么splice()行为怪异?

Javascript 为什么splice()行为怪异?,javascript,Javascript,我正在尝试将多个阵列展平为一个阵列,并删除阵列中的重复元素,以便FCC进行练习 具体来说,splice方法在控制台中显示一件事,但其作用不同。有人能告诉我为什么splice()不删除我用嵌套循环标识的重复项吗 function uniteUnique(arr) { var arr1 = arguments; newArr= []; for(var i=0; i<arr1.length; i++){ for(var l=0; l<arr1[i].length;

我正在尝试将多个阵列展平为一个阵列,并删除阵列中的重复元素,以便FCC进行练习

具体来说,splice方法在控制台中显示一件事,但其作用不同。有人能告诉我为什么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]));
功能单元(arr){
var arr1=参数;
newArr=[];

对于(var i=0;i不建议修改循环中的数组。如果不必使用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]));
函数uniteUnique(){
var newArr=[];

对于(var i=0;i您在这里有三个错误:

  • 这里不需要使用
    p+1
    。只要使用
    p

  • splice
    需要一个索引作为其第一个参数,但您正在将考虑删除的值作为索引传递以执行删除。这没有意义。您需要
    .splice(newArr[p],1)
    而不是
    .splice(p,1)

  • 你不能阻止一个值被视为潜在的重复。你的
    if
    条件还必须包括条件
    …&&p!=t
    ,因为
    newArr[t]==newArr[p]
    t
    等于
    p
    的情况下总是(无用的)真的


  • 关于“就地”删除方法中的重复项,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);
    

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

    控制台中的
    splice
    “行为怪异”如何?除了最终结果之外,您不会记录任何与之相关的语句/表达式。@Pineda console.log(“无拼接”,newArr[p+1]);console.log(“有拼接”)“,newArr.拼接(newArr[p+1],1))请编辑您的问题以提供您评论的上下文。
    splice
    使用您正在调用的数组进行变异。也就是说,随着循环的迭代,您正在更改数组。注销上面的“without splice”日志以了解我的意思。。这是真的,但给出了答案,因为OP没有要求对a的完整答案L算法,或者可能是我心胸狭窄——为了你的答案的准确性,投票结果也完全不相关:爱你的康威的人生游戏简介描述:D@apsillers你是对的,我已经改变了你提到的所有三件事,加上算法还有第四个问题:当我在spilic数组时,p索引会跳过一个ele因此,为了克服这个问题,我在条件的末尾添加了p-=1;。谢谢你。谢谢你的鼓励。我没有放弃,在你的提示和@apsiller的提示下,我让脚本开始工作了。