例如,如果我们有字符串str
并且我将其复制,那么它将是str_1
,str_2
,str_3
等等。
如果我复制str_2
,那么它将是str_2_1
,str_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>
答案 0 :(得分:1)
您可以搜索以给定名称开头的所有字符串以及短划线和结束编号。然后取最大结束数并以递增的版本返回给定的字符串。
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;
更传统
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;
答案 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的答案很好,可能是最短的! (我赞成她的回答)