Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在数组上循环并与正则表达式进行比较_Javascript_Prototypejs - Fatal编程技术网

Javascript 在数组上循环并与正则表达式进行比较

Javascript 在数组上循环并与正则表达式进行比较,javascript,prototypejs,Javascript,Prototypejs,所以,我承认我有点像JS noob,但据我所知,这应该是可行的,但事实并非如此 背景: 我有一张有3个列表框的表格。列表框命名为app1、db1和db2。我使用javascript允许用户添加额外的列表框,增加每个额外选择框的名称标记 当我添加其他应用程序命名框时,每个附加字段的值都会正确递增。如果我尝试添加名为selects的附加db,它将无法识别数组中第一个循环上的第二个标记。这导致我最终得到2个名为db2的元素。在每个后续标记上,它都被正确识别并正确递增 以下是db1标记的HTML: &l

所以,我承认我有点像JS noob,但据我所知,这应该是可行的,但事实并非如此

背景:

我有一张有3个列表框的表格。列表框命名为app1、db1和db2。我使用javascript允许用户添加额外的列表框,增加每个额外选择框的名称标记

当我添加其他应用程序命名框时,每个附加字段的值都会正确递增。如果我尝试添加名为selects的附加db,它将无法识别数组中第一个循环上的第二个标记。这导致我最终得到2个名为db2的元素。在每个后续标记上,它都被正确识别并正确递增

以下是db1标记的HTML:

<select name="db1">
  *options*
</select>
如果我添加应用程序标记,它将返回“app2”。如果我搜索一个db标记,它将在第一次通过返回'db2',在第二次返回db3,以此类推


所以,基本上,我确信我在这里做错了什么。

我会通过为db保留一个计数器和一个用于生成名称的应用程序保留一个计数器来处理它

var appCounter = 1;//set this manually or initialize to 0 and
var dbCounter = 2;//use your create function to add your elements on pageload
然后,当您要创建下一个标记时,只需增加计数器并将其用作您姓名的后缀:

var newAppElement = document.createElement('select');
newAppElement.name = 'app' + (++appCounter);
..

//  --OR for the db element--

var newDbElement = document.createElement('select');
newDbElement.name = 'db' + (++dbCounter );
..

您遇到的问题是正则表达式对象是有状态的。您可以通过将regex创建放在循环中来修复程序

function return_select_name(tag, tags) {
  matches = new Array();
  // <-- regex was here
  for (var i = 0; i < tags.length; i++) {
    var re = new RegExp(tag + "\\d+", "g"); //<--- now is here
    var found = re.exec(tags[i]);
    if (found != null) {
      matches.push(found[0]);
    }
  }
  matches = matches.sort();
  index = parseInt(/\d+/.exec(matches[matches.length-1])) + 1; //<--- I dont think matches.last is portable, btw
  index = tag + index;
  return index;
}

然后,您可以使用
found[1]
直接获取您的号码,而无需进行额外的步骤。

我知道这已经得到了回答,但我将其放在一起作为概念证明

它是一个对象,因此您可以在不同的场景中重用它。显然有很多方法可以改进,但我觉得很酷,所以我想我会和大家分享


console.debug
仅在Chrome和FF中工作。

现在还不清楚您在这里想要实现什么。您是否正在尝试生成类似“db1”、“db2”、“db3”的顺序名称。。。等然后如果你通过了“app”,你想让它从“app1”开始吗?基本上是的。只有使用app时,它才会返回app2,确实如此。我添加了
prototypejs
标记,因为没有它,代码根本无法工作。我喜欢这样,我让它变得比需要的更复杂。@Eugene:很高兴我能帮上忙:)
var newAppElement = document.createElement('select');
newAppElement.name = 'app' + (++appCounter);
..

//  --OR for the db element--

var newDbElement = document.createElement('select');
newDbElement.name = 'db' + (++dbCounter );
..
function return_select_name(tag, tags) {
  matches = new Array();
  // <-- regex was here
  for (var i = 0; i < tags.length; i++) {
    var re = new RegExp(tag + "\\d+", "g"); //<--- now is here
    var found = re.exec(tags[i]);
    if (found != null) {
      matches.push(found[0]);
    }
  }
  matches = matches.sort();
  index = parseInt(/\d+/.exec(matches[matches.length-1])) + 1; //<--- I dont think matches.last is portable, btw
  index = tag + index;
  return index;
}
// /tag(\d+)/
var re = new RegExp(tag + "(\\d+)", "g");