当前位置: 首页 > 知识库问答 >
问题:

JS for循环一次

符修杰
2023-03-14

我的问题是,我试图在一个数组上迭代多次,但是,我的for循环只会在该数组上迭代一次(或者在我看来是这样),这会导致结果错误。

我试图在这个数组上循环:让arr=[“e5”、“b2”、“a1”、“c3”、“d4”] 并根据字符串的编号抓取字符串,将其移动到第一、第二、第三。。。在阵列中的位置取决于该数字。

我的代码不会抛出任何错误,但是,它似乎只迭代一次,抓取"a1",将其移动到数组中的位置0,仅此而已。它不会再次迭代以抓取b2并将其移动到数组中的位置1。

接下来我想向您展示我的代码:

function order(words) {
  let sp = words.split(" ");   // Array to split string
  let pos = 1;   //variable to store number 1 to find in string
  let arr = []; //New array to push into, since trying to move values in same array wasn' tworking.
  for (let i = 0; i < sp.length; i++) {

    if (sp[i].includes(pos)) {
      arr.push(sp[i]);
      pos = pos + 1;

    }
    console.log(i);
  }

  return arr;
}

order("is2 Thi1s T4est 3a");

当我执行上面的代码时,它返回:

0
1
2
3
[ 'Thi1s' ]

如您所见,结果告诉我它迭代一次,获取“thi1s”并将其推送到新数组,然而,它在该点停止,不会执行其他迭代或其他推送操作。

我将I记录到控制台,查看它的迭代次数。

链接到REPL:https://repl.it/@Otho01/变量#索引。js公司


共有3个答案

余歌者
2023-03-14

整个方法都有缺陷。让我们尝试order("is2 Thi123s T24est do9 3a")。我希望结果是

["is2", "3a", "do9", "Te4est", "Thi123s"]

但我却得到了

["Thi123s", "is2", "Thi123s", "T24est", "Thi123s", "3a", "T24est"]

结果中甚至没有do9。

  • Thi123s匹配pos 1、2和3而不是pos123,这就是为什么你会得到重复的,并且你会在错误的地方得到它们。结果。
  • 您不会从sp中删除已处理的元素,因此它可以再次与不同的pos匹配,这也是您获得重复的原因。这意味着您一遍又一遍地检查每个pos
  • 的第一个元素
  • 您甚至不会计数到123,但如果您这样做了,您会检查从25122的每个数字的整个数组,而不会将单个值推送到返回的结果。

整个方法非常昂贵(就它的作用而言),并且在尝试修复它时会变得更加昂贵。所以让我们尝试一种不同的方法;让我们解析单词中的数字并按该数字对数组进行排序。

const logCalls = [];
function getNumber(word){
  logCalls.push(word);
  return Number(word.match(/\d+/));
}

function order(words){
  return words.split(" ").sort((a,b) => getNumber(a) - getNumber(b));
}

console.log(order("is2 Thi123s T24est do9 3a"));

console.log("getNumber calls:");
console.log(logCalls.join("\n"));
.as-console-wrapper{top:0;max-height:100%!important}
闻人树
2023-03-14

我还建议研究array.sort()方法,因为这可能会简化您的代码将其与查找字符串中的数字相结合,这应该可以解决您的问题

大堆sort()查找字符串中的数字

欧阳向文
2023-03-14

该算法只对单词数组循环一次。因为你所说的目标是根据每个单词内部的数字来找到每个单词的位置。有几种方法可以解决这个问题,但我将解释一个简单的算法。

您可以通过在位置上创建一个循环,并在此循环中在单词上创建另一个循环,来实现所需的结果。因此,对于每个位置,您将尝试找到属于该位置的单词。以下算法是该问题的众多解决方案之一:

function order(words){
  let sp = words.split(" ");
  let arr = [];

  for (let pos = 1; pos <= sp.length; pos++) {
    for (let i = 0; i < sp.length; i++) {
      if (sp[i].includes(pos)) {
        arr.push(sp[i])
      }
    }
  }
  
  return arr;
}

order("is2 Thi1s T4est 3a");

这段代码的结果是['Thi1s','is2','3a','T4est']

 类似资料:
  • 我试图实现每秒循环一次的ScheduledExecutorService线程,但现在它只循环一次。 我的问题是如何设置它,使它周期性地循环,而不是一次迭代? 另外,如何将连接池传递给线程,以便每次迭代都可以查询数据库?任何帮助都非常感谢。

  • 问题内容: 我正在尝试实现一个每秒循环的ScheduledExecutorService线程,但是截至目前,它仅循环一次。 我的问题是如何设置它,使其定期循环而不是一次迭代? 另外,如何将连接池传递到线程中,以便每次迭代都可以查询数据库?任何帮助深表感谢。 问题答案: http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent

  • 我的程序中有两个while循环。第一个是针对游戏菜单的,第二个是针对实际游戏的。如果“Gameover-Event”发生,我想返回菜单。我不知道该怎么做。

  • 您好,我对jquery没有什么问题。首先,我有: 大众BORA 1.9TDI 1990 1995 奥迪A3 2.0TFSI 2006 2008 但我想实现: VW BORA 1.9TDI 1990 VW BORA 1.9TDI 1991 VW BORA 1.9TDI 1992 VW BORA 1.9TDI 1993 VW BORA 1.9TDI 1994 VW BORA 1.9TDI 1995 A

  • 我只想循环一个具有相同xml元素但具有不同ID的jaxb封送,这与下面的代码不同,我正在为每个ID解析新的xml文件,并重写旧的xml文件。 数据[][]是从矩阵中读取的,数据[i][0]代表一个ID列表,我想将这些ID设置为客户ID。 以上代码的输出: 我想把所有ID输出到一个xml文件中,有什么提示吗?

  • 问题内容: 我第一次不了解PHP。我一直在脚本中使用for循环,while循环,foreach循环。我想知道 哪一个性能更好? 选择循环的标准是什么? 当我们在另一个循环中循环时应该使用哪个? 我一直想知道要使用哪个循环的代码。 很明显,我可以使用while编写上面的代码。希望有人能帮助我找出哪个循环更适合使用。 问题答案: 哪一个性能更好? 没关系 选择循环的标准是什么? 如果只需要遍历对象或数