2014-01-27 5 views
1

У меня есть строка, например:Заменить строку со значениями из двух массивов

var string = 'This is a text that needs to change'; 

И тогда у меня есть два массива.

var array1 = new Array('a', 'e', 'i', 'o', 'u'); 
var array2 = new Array('1', '2', '3', '4', '5'); 

Теперь, что я, что нужно сделать, это проверить строку с array1 и заменить строку с соответствующим значением из массива 2. Таким образом, с помощью функции, чтобы сделать это мне нужно, чтобы получить что-то вроде:

string = 'Th3s 3s 1 t2xt th1t n22ds to ch1ng2'; 

Любые идеи о том, как подойти к этой проблеме? И может быть эффективный подход? Поскольку я планирую использовать это на огромных кусках данных.

EDIT:

Основываясь на ответы здесь я скомпилированные коды, чтобы вышеуказанные операции, а также позволяет несколько специальных символов. Проверьте это.

var string = 'This is a text that needs to change'; 

var array1 = new Array('ee', 'a', 'e', 'i', 'o', ']'); 
var array2 = new Array('!', '1', '2', '3', '4', '5'); 

function escapeString(str){ 
    return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"); 
} 

var re = new RegExp('(' + escapeString(array1.join('ૐ')) + ')', 'g'); 
var nx = new RegExp(re.source.replace(/ૐ/g, "|"), 'g'); 
alert(nx); 
var lookup = {}; 
for (var i = 0; i < array1.length; i++) { 
    lookup[array1[i]] = array2[i]; 
} 

string = string.replace(nx, function(c){ 
    return lookup[c] 
}); 

alert(string); 
+0

Взгляните на HTTP: // StackOverflow.com/questions/2064047/javascript-replace-globally-with-array –

+0

Вы ищете эквивалент JavaScript [PHP 'str_replace'] (http://php.net/str_replace), что-то вроде http://phpjs.org/functions/str_replace /: 'output = str_replace (array1, array2, input)' – feeela

+0

Возможный дубликат [Замена букв в строке с использованием двух массивов?] (http://stackoverflow.com/questions/21064918/replacing-letters- in-a-string-using-two-arrays) – georg

ответ

3

Если заменяемые символы являются обычными буквами и не имеют особого значения в регулярном выражении, вы можете сделать регулярное выражение, которое соответствует только этим символам. Это позволяет использовать один заменить функцию, которая переводит эти символы:

var string = 'This is a text that needs to change'; 

var array1 = new Array('a', 'e', 'i', 'o', 'u'); 
var array2 = new Array('1', '2', '3', '4', '5'); 

var str1 = array1.join(''); 
var re = new RegExp('[' + str1 + ']', 'g'); 

string = string.replace(re, function(c){ 
    return array2[str1.indexOf(c)] 
}); 

Демо: http://jsfiddle.net/Guffa/2Uc92/

+1

Это должен быть самый быстрый способ здесь. – Xotic750

+0

Спасибо этой работе отлично. Еще один вопрос, который я не знаю, должен ли я опубликовать отдельный вопрос, но здесь он идет: скажем, ваш первый массив выглядит так: ('ae', 'a', 'e', ​​...) 'и второй, как этот '('!', '1', '2', ...)'. Есть ли способ перенести преобразование 'ae'' раньше, чем« a' »и« e' »? Например, 'ae^& + -' должен преобразовать в '!^& + -', а не '12^& + - '. Есть идеи? – pewpewlasers

+1

@pewpewlasers: Если у вас есть комбинации символов в массиве, вам нужно немного изменить подход. Создайте шаблон для регулярного выражения, используя '' ('+ array1.join (' | ') +') '', и чтобы найти совпадающую строку в замене, используйте поиск хэша, как показал Мэтт. Демо: http://jsfiddle.net/Guffa/2Uc92/1/ – Guffa

0

Если предположить, что два массива имеют одинаковый размер:

for(var i = 0; i < array1.length; i++){ 
    mystr = mystr.replace(array1[i], array2[i]); 
} 
+1

Это заменит только первое появление каждого символа. – Guffa

+0

Метод replace заменяет все вхождения искомой строки: http://www.w3schools.com/jsref/jsref_replace.asp – Fedaykin

+0

Вот [jsFiddle] (http://jsfiddle.net/Xotic750/c8wTN/), используя ваш код, вы можете ясно видеть, что он не работает так, как вы ожидаете, и что совет, который @Guffa дал вам, верен. – Xotic750

4
for(var x = 0 ; x < array1.length; x++) 
    string = string.replace(new RegExp(array1[x], "g"), array2[x]) 

FIDDLE

+0

Это заменит только первое появление каждого символа. – Guffa

+0

@ Guffa, вы правы, ответьте на обновления. Спасибо – BeNdErR

1

Вот пример:

var string = 'This is a text that needs to change'; 

var vowels = ['a','e','i','o','u']; 
var numbers = [1,2,3,4,5]; 

var result = string.replace(/./g, function(char) { 
    var idx = vowels.indexOf(char); 
    return idx > -1 ? numbers[idx] : char; 
}); 
//^ Th3s 3s 1 t2xt th1t n22ds t4 ch1ng2 
0

Для изучения других интересных способов сделать то же самое, вот используя массив реализации карта.

Это просто еще один классный способ сделать это, без использования цикла, замены или регулярного выражения.

var string = 'This is a text that needs to change'; 
var array1 = ['a', 'e', 'i', 'o', 'u']; 
var array2 = ['1', '2', '3', '4', '5']; 

var a = string.split(''); 
a.map(function(c) { 
    if (array1.indexOf(c) != -1) { 
     a[ a.indexOf(c) ] = array2[ array1.indexOf(c) ]; 
    } 
}); 

var newString = a.join(''); 
alert(newString); 
//Outputs "Th3s 3s 1 t2xt th1t n22ds t4 ch1ng2" 

Демо: JSFiddle

Интересный блог о методах массива - map and reduce.

Мне бы хотелось услышать мысли о производительности карты массива и других методах.

+0

Медленный и способ, которым вы это сделали, ограничен 4294967296 символами. :) – Xotic750

+0

Использование 'reduce' like [jsFiddle] (http://jsfiddle.net/Xotic750/Ca9ey/) было бы лучше. Скорость будет по-прежнему (как) медленной, но не более ограниченным количеством символов. – Xotic750

+0

@ Xotic750 Tnx это круто! :) – Yani

2

Это устанавливает 1 RegExp и звонит replace только один раз.

var string = 'This is a text that needs to change'; 
var array1 = new Array('a', 'e', 'i', 'o', 'u'); 
var array2 = new Array('1', '2', '3', '4', '5'); 

var regex = new RegExp('['+array1.join('')+']', 'g'); 

var lookup = {}; // Setup a hash lookup 
for(var i=0 ; i<array1.length ; ++i) 
    lookup[array1[i]] = array2[i]; 

string.replace(regex, function(c) { return lookup[c]; }); 
// "Th3s 3s 1 t2xt th1t n22ds t4 ch1ng2" 

http://jsfiddle.net/2twr2/

+0

+1 Поисковая оптимизация - хорошая идея. Это особенно полезно, если вам нужно настроить код для комбинаций символов в первом массиве. – Guffa

+0

Спасибо, это здорово. Хотя Гуффа уже ответил на этот вопрос, этот ответ решает проблемы сочетания символов. – pewpewlasers

+0

Спасибо за помощь. Основываясь на ваших ответах и ​​ответах Guffa, я составил окончательную версию, которая также допускает несколько специальных символов. ;) – pewpewlasers

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