var list = [" Text"," Text - Copy"," Text - Copy(1)"," Text - Copy - 复制","文本 - 复制(1) - 复制"];
我正在尝试创建这样的唯一列表。这些都是String" Text"的副本。我坚持创造独特后缀的逻辑。后缀只会是" - 复制"或" - 复制(n)&#34 ;; n是副本的数量(n = {1,2,3,......})。第二部分就像我们在windows中创建新文件夹时所做的那样(如果我们创建另一个新文件夹,它被命名为新文件夹(2),那么只有在Windows中才有区别等等,但这里是" - 复制(1)& #34;," - 复制(2)"依此类推)。这个命名约定是我原始要求的一部分。
概念:
考虑空字符串数组
用户提供一些输入,逻辑应该创建该输入的副本,如链接中嵌入的图片:
请访问此链接并查看下载sample.jpg:
http://s000.tinyupload.com/index.php?file_id=16853795955702626977
基本上,如果我的数组是空的,输入就是" Text"那么逻辑应该像第一个条目那样为我提供输出和最终数组输出。如果没有那么考虑第二个条目,这里我再次提供相同的输入,理想情况下输出应该是"文本 - 复制"但由于它已经存在于最终数组中,因此输出应为" Text - Copy(1)"。逻辑应该能够在处理完输出后推断出它并将在最终数组中添加。
如果第三次提供相同的输入(" Text"),则输出字符串应为" Text - Copy(2)"。也可以输入第3或第4项。输入将始终来自" set"最终数组本身,即如果我的最终数组是["文本","文本 - 复制","文本 - 复制(1)","文本 - 复制 - 复制","文本 - 复制 - 复制(1)"]然后输入的选择是这些值之一。
这样它应该能够创建唯一的数组。逻辑应该可以用空数组或最开始给出的数组来实现。
现在,我正在做的是使用正则表达式(JavaScript匹配方法),我发现"复制"在输入中。如果count为0,那么输入就像第一个或第二个条目一样,然后我在搜索生成的输出是否在最终数组中,基于此搜索,我要么是后缀" - 复制"或者只是在"中添加/更新n - 复制(n)"。如果条目很少,那么这个逻辑可以正常工作,但是有更多的条目,一切都可以进行折腾。
请帮助!!
由于
答案 0 :(得分:0)
检查这个小提琴。
http://jsfiddle.net/sggndr6x/3/
主要部分如下
(你需要underscore.js) function do_it(input,final_arr){
var SUF = ' - Copy'
// input text is first occurence in final_arr
if(!_(final_arr).contains(input)){
return input
}
// input text is the second occurence in final_arr
var copied = input + SUF
if(!_(final_arr).contains(copied)){
return copied
}
var reg = new RegExp(copied + '\\((\\d)\\)$')
var matches = _(_(final_arr).map(function(d){ return d.match(reg) })).compact()
// final_arr == ['text', 'text - Copy']
if(matches.length == 0){
return copied + '(1)'
}
// final_arr == ['text', 'text - Copy', 'text - Copy(1)', .. 'text - Copy(n)' ]
var max = _.max(matches, function(m){ return parseInt(m[1]) })
return max[0].replace(/\(\d+\)$/, '(' + (parseInt(max[1]) + 1) + ')')
}