2016-04-30 3 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 разные дети и первой свой идентификатор 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-> (и отдельного индекса для размера таблицы) вместо массива с амортизированной стоимостью O (n). – Alnitak

+0

@ Alnitak: ничего себе, это будет лучше и проще .... спасибо ... Я обновлю –

+0

Спасибо, это хороший ответ, но вы даете результат ["products/[1]/application/[2]/tabbed/[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] после приложения, так как есть два разных числа для замены – Ege

Смежные вопросы