【问题标题】:D'ont understand the result of this "for" loop (reedit) [duplicate]不明白这个“for”循环的结果(reddit)[重复]
【发布时间】:2021-08-24 12:57:54
【问题描述】:

我想做一个小程序,从数组中删除一些不需要的字符,如“/n”、“/t”,问题是它部分工作。我看到程序删除了一些我想要的字符,但不是所有索引(例如:第 3 和第 5):

程序:

var contenuespacemenu = $('.Espace-Menu').children('div').html(); //the array which contains characters i want to delete.  
var bannedcaractere = ["\n", "\t"];
var caractereinside = [];

  for (var i = 0; i < 50; i++) {
    for (var j = 0; j < (bannedcaractere.length); j++) {
      let test = contenuespacemenu[i] == bannedcaractere[j];
      if (test) {
        i = i + 1;
      } else {
        caractereinside[i] = contenuespacemenu[i];
      }
    }
  }


console.log(caractereinside);

它显示了这个结果:

一些不需要的字符被删除但不是全部... 索引 3 和 5。

这里是将html标签的字符串内容逐个字符放入数组“caractereinside”的主要代码:

var contenuespacemenu = $('.Espace-Menu').children('div').html();
//var bannedcaractere = ["\n","\t"];
var caractereinside = [];



for (var i = 0; i < 50; i++) {

  caractereinside[i] = contenuespacemenu [i];
  }

console.log(caractereinside);

结果:

如果我将“var contenuespacemenu”转换为像这样的常规数组,它可以工作:

var contenuespacemenu = ["1","2","3","4","5","6","7","8"];
//var bannedcaractere = ["\n","\t"];
var caractereinside = [];



for (var i = 0; i < 50; i++) {

  caractereinside[i] = contenuespacemenu [i];
  }

console.log(caractereinside);

我明白了:

我还尝试用一个中断来替换 i = i+1,就像我被要求的那样,就像这样:

var contenuespacemenu = $('.Espace-Menu').children('div').html();
var bannedcaractere = ["\n","\t"];
var caractereinside = [];



for (var i = 0; i < 50; i++) {
  for (var j = 0; j < (bannedcaractere.length); j++) {
    let test = contenuespacemenu[i] == bannedcaractere[j];
    if (test) {
      break;
    }
    else {
      caractereinside[i] = contenuespacemenu[i];

  }

  }
}


console.log(caractereinside);

但它给了我这个:

最后,我再次尝试使用 i = i+1 并为 var contenuespacemenu 定义数组,还更改了 var 禁止字符,它的工作方式与预期一样:

var contenuespacemenu = ["1","2","3","4","5","6","7","8"];//the array which contains characters i want to delete.
var bannedcaractere = ["1", "2","3","4"];
var caractereinside = [];

  for (var i = 0; i < 50; i++) {
    for (var j = 0; j < (bannedcaractere.length); j++) {
      let test = contenuespacemenu[i] == bannedcaractere[j];
      if (test) {
        i = i+1;
      } else {
        caractereinside[i] = contenuespacemenu[i];
      }
    }
  }


console.log(caractereinside);

结果:

【问题讨论】:

  • 听起来你的想法过于复杂了,为什么不用includes()这样的东西?
  • 首先,你的contenuespacemenu不是一个数组,jQuery的.html()返回一个字符串。第二,为什么i从0到50,为什么不首先考虑contenuespacemenu的实际长度?
  • 这可以作为一个带有一点正则表达式的单行来完成……
  • 手动增加 i 会破坏循环计数器。

标签: javascript jquery for-loop indices


【解决方案1】:

不确定您为什么要使用 2 个循环,但我已通过更改以下内容将您的上一个示例更改为工作状态:

  • 将硬编码的50 更改为contenuespacemenu.length
  • 而不是关闭第二个循环/test,我将使用!bannedcaractere.includes(contenuespacemenu[i]) 检查当前字符是否有效
  • 删除了 i = i+1;,因为我们应该让 for 处理迭代器
  • 使用push() 而不是关闭caractereinside[i] 以防止undefined 出现在已删除的索引上

var contenuespacemenu = ["1","2","3","4","5","6","7","8", "1","2","3"];
var bannedcaractere = ["1", "2","3","4"];
var caractereinside = [];

// Remove all from bannedCars
for (var i = 0; i < contenuespacemenu.length; i++) {
    if (!bannedcaractere.includes(contenuespacemenu[i])) {
      caractereinside.push(contenuespacemenu[i]);
    }
}

// Result
console.log(caractereinside);

也就是说,上面可以通过使用filterincludes来简化:

var contenuespacemenu = ["1","2","3","4","5","6","7","8", "1","2","3"];
var bannedcaractere = ["1", "2","3","4"];

// Filter
let caractereinside = contenuespacemenu.filter(n => !bannedcaractere.includes(n));

// Result
console.log(caractereinside);

【讨论】:

  • bannedcaractere 可能是Set
  • 哎呀,感谢您注意到@3limin4t0r。
  • @AnthonyGarcia-Labiad,好的,但我在帖子中说它适用于这种包含 "1","2" 的字符串......但它不适用于 "/n"和“/t”字符,不知道为什么
  • @3limin4t0r,是的,我注意到了
  • 不要认为你的代码在任何给定的情况下都可以工作。请尝试上面的示例,如果您遗漏任何内容,请告诉我们。
【解决方案2】:

如果contenuespacemenu 是一个数组,试试:

const contenuespacemenu = $('.Espace-Menu').children('div').html(); //the array which contains characters i want to delete.  
const bannedcaractere = ["\n", "\t"];
const caractereinside = contenuespacemenu.slice(0, contenuespacemenu.length); // I copy the table so as not to risk modifying it later

for (let i = 0; i < 50; i++) {
  let test = bannedcaractere.includes(caractereinside[i]);
  if (test) {
    caractereinside.splice(i, 1);
  } 
}

// 50 must be the length of the characterinside array if you want to iterate over the whole array

console.log(caractereinside);

Else If contenuespacemenu一堆文字试试:

const contenuespacemenu = $('.Espace-Menu').children('div').html(); //the array which contains characters i want to delete.
const bannedcaractere = ["\n", "\t"];
const caractereinside = [];

for (const i = 0; i < 50; i++) {
  caractereinside[i] = contenuespacemenu[i];
  let test = bannedcaractere.includes(caractereinside[i]);
  if (test) {
    caractereinside.splice(i, 1);
  }
}

// 50 must be the length of the characterinside array if you want to iterate over the whole contenuespacemenu

console.log(caractereinside);

【讨论】:

  • 我尝试了您的修改,但它不起作用,向我显示此消息:未捕获的 TypeError: caractereinside.splice is not a function
  • 你能在for循环之前打印出caractereinside的值吗?因为Uncaught TypeError: caractereinside.splice表示不定义或者不是数组
  • 或者错误可能来自 for 循环,你必须有 for (let i = 0; i &lt; 50; i++) 而不是 for (const i = 0; i &lt; 50; i++)。我已经用我自己的数组数据测试了它对我来说可以正常工作。如果它对您不起作用,请在循环之前检查 caractereinside 的值。如果数据正确,它必须在标准范围内工作
  • contenuespacemenu 不是数组而是一堆文本
  • 这个答案存在一些问题。 1) 第一个代码块遍历caractereinside,并使用splice 删除不需要的元素。问题是splice 将移动数组。 i 应进行调整以适应此更改。这意味着您应该在spliceing 之后减少i。否则,永远不会检查移动到已删除元素位置的元素。 2) 第二个代码块使caractereinside 数组留有空槽,这可能是不希望的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-16
  • 1970-01-01
相关资源
最近更新 更多