【问题标题】:Why is this for loop not removing all repetitions of arrays?为什么这个 for 循环没有删除所有重复的数组?
【发布时间】:2022-10-13 22:15:26
【问题描述】:

Backset 是一个数组数组,我试图过滤掉任何包含重复元素的数组,例如一个有 2 个元素的数组。我想从 Backset 数组中删除这些。

然而这并没有发生,backSet 中的一些数组,例如 [1,2,2] 留在 backSet 中。

for(z=0; z<backSet.length; z++){
    backSet[z].sort();
    tempBackSort = [];
    for(k=0; k< backSet[count].length; k++){
      if(tempBackSort.includes(backSet[count][k])){
        backSet.splice(backSet.indexOf(backSet[count]),1);
        kon = 0;
        continue;
      } else{
        tempBackSort.push(backSet[count][k]);
        kon = 1;
      }
    }

    if(kon===1){
      count++;
    }
    
    backSet[z].sort();
  }

【问题讨论】:

  • @Ivar我以为我通过使用 kon 变量整理了跳过索引,所以如果没有删除数组,索引只会上升
  • kon 变量没有意义,因为它在循环中什么都不做
  • 如果没有minimal reproducible example,就很难完全遵循逻辑。但是有两件事对我来说很突出:从backSet 中删除该项目后,您继续在内部 for 循环中循环。并且您的 kon 变量会被循环的每次迭代覆盖,因此您实际上只检查最后一个元素。
  • @JaromandaX我添加它的原因是它在删除元素时不会跳过索引
  • @Ivar 继续;删除项目后不跳出for循环?

标签: javascript arrays loops for-loop if-statement


【解决方案1】:

有几个问题:

  • 你有continue 现在它什么也没做。你需要break,所以退出内循环

  • 您尝试克服使用count 有时会删除元素的数组的迭代问题,但是:

    • count 未初始化
    • 您的代码仍然可以使用backSet[z] 而不是backSet[count]
    • 当一个元素被移除时减少z 会更容易,甚至更好:让外部循环从头到尾向后迭代——然后你不需要调整任何索引。
  • 变量被隐式声明为全局变量:这是不好的做法。使用letconst 定义变量。

  • 通过对内部数组进行排序,您可以改变原始数据。对于您的情况,这可能没问题,但对于依赖于这段代码的代码来说,这仍然可能令人惊讶。

  • 排序也不是查找重复项的最有效方法。不要将值推入tempBackSort,而是将它们放入Set(不能包含重复项)并将其大小与原始数组进行比较:如果它们的大小不同,则存在重复项。

  • 不要在循环内拼接(这是造成麻烦的原因),而是使用数组方法filter 返回过滤后的数组。

以下是它的编码方式:

backSet = backSet.filter(arr => (new Set(arr)).size == arr.length);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-09
    • 1970-01-01
    • 2019-03-30
    • 1970-01-01
    • 2020-01-07
    • 2014-11-20
    • 2023-01-27
    • 2018-02-14
    相关资源
    最近更新 更多