复制字符串和增量版本

时间:2018-02-02 08:48:20

标签: javascript

例如,如果我们有字符串str并且我将其复制,那么它将是str_1str_2str_3等等。

如果我复制str_2,那么它将是str_2_1str_2_2,依此类推。

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

function createName(nameToCopy) {
  var i;
  var version = 1;

  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 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;
}
<button onclick="createName('Test2')">Click me</button>

<p id="demo"></p>

3 个答案:

答案 0 :(得分:1)

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

&#13;
&#13;
function createName(nameToCopy) {
    var copies = ["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(new RegExp(nameToCopy + '_' + '\\d+$'))),
        version = filtered.reduce((v, s) => Math.max(v, +s.match(/\d+$/)[0]), 0);

    return nameToCopy + '_' + ++version;
}

console.log(['Test2', 'Test', 'Test2_2'].map(createName));
&#13;
&#13;
&#13;

更传统

&#13;
&#13;
function createName(nameToCopy) {
    var copies = ["Test2", "Test2_2", "Test2_3", "Test2_4", "Test2_2_2", "Test2_3_1", "Test2_2_1_2", "Test2_2_3"],
        regexp = new RegExp(nameToCopy + '_' + '\\d+$'),
        version = 0,
        i, v;

    for (i = 0; i < copies.length; i++) {
        if (regexp.test(copies[i])) {
            v = +copies[i].match(/\d+$/)[0];
            if (v > version) {
                version = v;
            }
        }
    }
        
    return nameToCopy + '_' + (version + 1);
}

console.log(['Test2', 'Test', 'Test2_2'].map(createName));
&#13;
&#13;
&#13;

答案 1 :(得分:0)

我不确定你在这里要做什么,或者为什么,所以我无法对你的代码做出真正的评论。请注意,它不是太有效,也不太容易理解。作为旁注,你的html不会调用你编写的代码。

回答你为什么返回'Test2_4'的问题:你的代码循环遍历你输入nameCopiesArr的硬编码值,而version变量保存当前名称的编号+ 1.然后用你的代码覆盖结果来自数组中的下一个条目。由于数组中的最后一个条目是'Test2_2_3',你抓住那里的最后一个数字 - 这是3 - 并且加1,所以在你最后一次迭代后,版本变量保持值为4 - 这就是你返回的。

答案 2 :(得分:0)

我更新你的代码以测试'_'字符的编号以及当前字符串是否包含给定的输入。

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;
}

但@Nina的答案很好,可能是最短的! (我赞成她的回答)

JSFiddle