2016-04-30 38 views
-4

我有一个像这样的字符串数组。替换字符串数组中的数字javascript

var items= ['products/600/application/286/tabbed/301/text', 
      'products/600/application/286/tabbed/305/text', 
      'products/600/application/500/tabbed/200/text', 
      'products/600/application/500/tabbed/300/text', 
      'products/600/application/286/tinytext', 
      'products/600/differenttext']; 

我需要连续编号更换号码(相同的数字应该是相同的)和输出应该是这样的:

var items= ['products[1]/application[1]/tabbed[1]/text', 
       'products[1]/application[1]/tabbed[2]/text', 
       'products[1]/application[2]/tabbed[1]/text', 
       'products[1]/application[2]/tabbed[2]/text', 
       'products[1]/application[1]/tinytext', 
       'products[1]/differenttext']; 

注意,相同的数字应该得到例如所有286相同的结果应该是[1],因为它是最低的,500应该替换为[2],因为它是下一个更大的垂直。把他们想象成孩子。例如,对于行

products/600/application/286/tabbed/301/text, 
products/600/application/286/tabbed/305/text, 

其同直到tabbed,但在那之后,有2名不同的儿童和第一次的id是301秒是305所以他们应该[1] [2]。现在看行

products/600/application/286/tabbed/305/text, 
products/600/application/500/tabbed/200/text, 
products/600/application/500/tabbed/300/text, 

在这种情况下,应用程序有两个孩子。 286和500.第二个是500,它有2个孩子。所以500的孩子应该是1和2(200和300)

我申请temp= items[0].match(/\d+/g);后我得到结果[600,286,301]。我是否应该使用json对象来放置从temp获得的所有结果,或者使用2d数组?

+1

JSON在这里无关紧要 - 它是一个序列化格式 – Alnitak

+0

这是我不清楚问题是什么 –

+0

@Ege它将帮助,如果你的示例输出实际上是正确的...... – Alnitak

回答

3

可以使用map()做这样的事情replace()

var items = ['products/600/application/286/tabbed/301/text', 
 
    'products/600/application/286/tabbed/305/text', 
 
    'products/600/application/500/tabbed/200/text', 
 
    'products/600/application/500/tabbed/300/text', 
 
    'products/600/application/286/tinytext', 
 
    'products/600/differenttext' 
 
]; 
 
var num = {}; 
 

 
var res = items.map(function(v, i) { // iterate over the array for generating updated array 
 
    return v.replace(/\/(\d+)\/(?:(.*?)\/(\d+)\/(?:(.*?)\/(\d+)\/)?)?/, function(m, m1, m2, m3, m4, m5) { //find the number to replace 
 
    var str = replace(m1, 'main', 0); 
 
    if (m3) { 
 
     str += m2 + replace(m3, m1); 
 
     if (m5) 
 
     str += m4 + replace(m5, m1 + '_' + m3); 
 
    } 
 
    return str; 
 
    }); 
 
}); 
 

 
function replace(mat, ind1) { 
 
    if (!num[ind1]) 
 
    num[ind1] = { 
 
     ind: 0 
 
    }; 
 
    if (num[ind1][mat]) // check index already defined 
 
    return '/[' + num[ind1][mat] + ']/'; // if defined use the previous 
 
    num[ind1][mat] = ++num[ind1].ind ;// else update index in object 
 
    return '/[' + num[ind1].ind + ']/'; // and return the replace string 
 
} 
 

 
document.write('<pre>' + JSON.stringify(res, null, 3) + '</pre>');


UPDATE: 如果出现次数多于3,那么你可以做点什么吧柯本,

var items = ['products/600/application/286/tabbed/301/text/222/kjkjk', 
 
    'products/600/application/286/tabbed/301/text/112/kjkjk', 
 
    'products/600/application/286/tabbed/305/text/222/kjkjk', 
 
    'products/600/application/500/tabbed/200//text/222/kjkjk', 
 
    'products/600/application/500/tabbed/300/text', 
 
    'products/600/application/286/tinytext', 
 
    'products/600/differenttext' 
 
]; 
 
var num = {}; 
 

 
var res = items.map(function(v, i) { // iterate over the array for generating updated array 
 
    var match = 'match'; 
 
    return v.replace(/\/(\d+)\//g, function(m, m1) { 
 
    var res = replace(match, m1); 
 
    match += '_' + m1; 
 
    return res; 
 
    }); 
 
}); 
 
78 
 

 
function replace(ind1, m1) { 
 
    if (!num[ind1]) 
 
    num[ind1] = { 
 
     ind: 0 
 
    }; 
 
    if (!num[ind1][m1]) 
 
    num[ind1][m1] = ++num[ind1].ind; 
 
    return '/[' + num[ind1][m1] + ']/'; 
 
} 
 

 
document.write('<pre>' + JSON.stringify(res, null, 3) + '</pre>');

+0

好的答案,但我会一直试图使用地图来保存number-> index表(并为表大小单独索引),而不是具有分期O(n)查找成本的数组。 – Alnitak

+0

@Alnitak:哇,这将是更好,更容易的方式....谢谢...我会更新 –

+0

谢谢你这是一个很好的答案,但你的结果[“产品/ [1] /应用程序/ [2] /标签/ [3]/text“,”products/[1]/application/[2]/tabbed/[4]/text“,”products/[1]/application/[5]/tabbed/[6]/text “,”products/[1]/application/[5]/tabbed/[7]/text“,”products/[1]/application/[2]/tinytext“,”products/[1]/differenttext“] 。所以,你得到例如[5]申请后,我需要[1] [2]的应用,因为有2个不同的数字来代替后 – Ege