Javascript创建给定字符串文本的唯一副本

时间:2014-11-18 19:16:09

标签: javascript arrays regex string

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)"。如果条目很少,那么这个逻辑可以正常工作,但是有更多的条目,一切都可以进行折腾。

请帮助!!

由于

1 个答案:

答案 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) + ')')
}