Javascript 复制字符串和增量版本

Javascript 复制字符串和增量版本,javascript,Javascript,例如,如果我们有字符串str,我复制它,它将是stru 1,stru 2,stru 3等等 如果我复制str_2,那么它将是str_2_1,str_2_2等等 我有以下逻辑,但它不起作用。。 它应该返回“Test2_5”(因为Test2和Test2_4已经存在),但它返回“Test2_4” 函数createName(nameToCopy){ var i; var版本=1; 变量nameCopiesArr=[“Test2”,“Test2_2”, “测试2_3”, “测试2_4”, “Test2_

例如,如果我们有字符串
str
,我复制它,它将是
stru 1
stru 2
stru 3
等等

如果我复制
str_2
,那么它将是
str_2_1
str_2_2
等等

我有以下逻辑,但它不起作用。。 它应该返回“Test2_5”(因为Test2和Test2_4已经存在),但它返回“Test2_4”

函数createName(nameToCopy){
var i;
var版本=1;
变量nameCopiesArr=[“Test2”,“Test2_2”,
“测试2_3”,
“测试2_4”,
“Test2_2_2”,
“测试2_3_1”,
“测试2_2_1_2”,
“测试2_2_3”
];
if(namecopiesar&&namecopiesar.length>1){
对于(i=0;i
点击我

我不确定您想在这里做什么,或者为什么,所以我无法对您的代码进行评论。请注意,它不是很有效,也不是很容易理解。另外,html不会调用您编写的代码


要回答为什么返回“Test2_4”的问题:代码循环遍历输入到nameCopiesArr中的硬编码值,版本变量保持当前名称的编号+1。然后用数组中下一个条目的结果覆盖它。由于数组中的最后一个条目是“Test2_2_3”,因此您可以获取其中的最后一个数字,即3,并将其加上1,因此在上次迭代后,版本变量的值为4,这就是您返回的值。

您可以搜索以给定名称、破折号和结束号开头的所有字符串。然后取最大结束数并返回给定的字符串和递增的版本

函数createName(nameToCopy){
风险值副本=[“Test2”、“Test2_2”、“Test2_3”、“Test2_4”、“Test2_2_2”、“Test2_3_1”、“Test2_2_1_2”、“Test2_2_3”],
filtered=copies.filter(/./.test.bind(新的RegExp(nameToCopy++'.'+'\\d++')),
version=filtered.reduce((v,s)=>Math.max(v,+s.match(/\d+$/)[0]),0);
返回nametopy+'''++版本;
}

log(['Test2','Test','Test2_2'].map(createName))我将更新您的代码,以测试“\u”字符的数量以及当前字符串是否包含给定的输入

function createName(nameToCopy) {
  var i;
  var version = 1;
  var nameToCopy_Nb = (nameToCopy.match(/_/g) || []).length; //number of the '_' char

  var nameCopiesArr = ["Test2", "Test2_2",
    "Test2_3",
    "Test2_4",
    "Test2_2_2",
    "Test2_3_1",
    "Test2_2_1_2",
    "Test2_2_3"
  ];

  if (nameCopiesArr && nameCopiesArr.length > 1) {
    for (i = 0; i < nameCopiesArr.length; i++) {
      var item_Nb = (nameCopiesArr[i].match(/_/g) || []).length;//number of the '_' char
      if (nameCopiesArr[i].indexOf(nameToCopy) !== -1 && item_Nb === nameToCopy_Nb + 1) {
        var indexes = nameCopiesArr[i].lastIndexOf('_') ? nameCopiesArr[i].match(/\d+$/) : 0
        if (indexes) {
          version = indexes[indexes.length - 1];
          version = parseInt(version) + 1;
        }
      }
    }
  }
  p = nameToCopy + '_' + version;
  document.getElementById("demo").innerHTML = p;
  return p;
}
函数createName(nameToCopy){
var i;
var版本=1;
var nameToCopy_Nb=(nameToCopy.match(/u/g)| |[])。长度;//字符的个数
变量nameCopiesArr=[“Test2”,“Test2_2”,
“测试2_3”,
“测试2_4”,
“Test2_2_2”,
“测试2_3_1”,
“测试2_2_1_2”,
“测试2_2_3”
];
if(namecopiesar&&namecopiesar.length>1){
对于(i=0;i
但是@Nina的答案很好,而且可能是最短的!!!(我赞成她的回答)


您从哪里知道副本是从一个开始的,还是只是一个计数副本?请添加为什么使用给定的
'Test2'
它应该返回
'Test2_5'
。这背后的逻辑是什么?可能是因为rest2和test2_4已经存在,因为这是上面解释的需求。我点击了“Test2”,然后它会生成“Test2_1”,然后下次它会是“Test2_2”,像这样的“Test2_3”。。。目前,我们的阵列的最大数字是“Test2_4”,因此在这之后,它将增加1个版本,因此它将是“Test2_5”
Test2_2_3
中的3,而不是
Test2_4
中的4,因为
.lastIndexOf(“'u')
-您需要计算
中的3-它们必须尽可能少才能好。。想做这样的事情,但不知道什么时候我才能达到那个水平…-)嘿,尼娜实际上“拷贝”是我实际代码中对象的数组,为了简单起见,我把它作为数组。所以现在我无法为对象数组运行此代码。我不明白如何调用filtered=copies.filter(/./.test.bind(new RegExp(nameToCopy++'.''+'\\d++')),version=filtered.reduce((v,s)=>Math.max(v,+s.match(/\d++$/)[0]),0);然后采用第二种方法并使用属性,例如
copies[i].prop
而不是
copies[i]