2012-06-19 2 views
1

Я пишу фрагмент кода в JavaScript, который должен заменить все вхождения символа в нескольких строках внутри объекта JSON obj.Поиск vs Поиск и замена

Не все строки содержат определенный символ, и мы говорим о много строк. Поэтому мой вопрос: если говорить об эффективности, лучше всего заменить или искать строку для символа, и только если нашли make replace?

Другими словами:

var obj = ["str","str2","tr3","str","tr2","str3","str","s22tr2","str3","st","rtr2","str3","str","str2","str3","str","str2","str3","str","str2","str3","str","str2","str3","str","str2","str3","str","str2","str3","str","str2","str3","str","str2","str3","str","str2","str3"]; 

вариант 1:

for(var i=0;i<obj.length;i++){ 
    if(obj[i].indexOf("s")!=-1){ 
     document.write(obj[i].replace(/s/gi,"*")); 
    } 
}​ 

вариант 2:

for(var i=0;i<obj.length;i++){ 
    document.write(obj[i].replace(/s/gi,"*")); 
}​ 

Мысли?

Спасибо.

+5

Вы пробовали тестирования кода в [JSPerf] (http://jsperf.com/)? – Joseph

+2

Это зависит в значительной степени от того, сколько из них будет содержать символ, поэтому профилирование всегда является лучшим подходом. – mellamokb

+1

'if (str1.indexOf (" o "))' означает «Если первый символ не является« o », значит, это почти не то, что вы хотите. – Quentin

ответ

0

Это зависит от количества элементов в объекте и размера каждого элемента с прямой заменой в большинстве случаев быстрее. То, что на сегодняшний день является самым быстрым для образца, который вы предоставили, - это «присоединиться и заменить». Проверьте этот очень ленивый пример:

var obj = ["str","str2","tr3","str","tr2","str3","str","s22tr2","str3","st","rtr2","str3","str","str2","str3","str","str2","str3","str","str2","str3","str","str2","str3","str","str2","str3","str","str2","str3","str","str2","str3","str","str2","str3","str","str2","str3"]; 
var b = obj.join(','); 
b +=',' + b; // * 2 
b +=',' + b; // * 4 
b +=',' + b; // * 8 
b +=',' + b; // * 16 
b +=',' + b; // * 32 
b +=',' + b; // * 64 
b +=',' + b; // * 128 
obj = b.split(','); 
var t1 = new Date().getTime(); 

for(var i=0;i<obj.length;i++) 
    if(obj[i].indexOf("s")!=-1 || obj[i].indexOf("S")!=-1) 
     document.write(obj[i].replace(/s/gi,"*")); 
    else 
     document.write(obj[i]); 
document.write('<br>'); 

var t2 = new Date().getTime(); 

for(var i=0;i<obj.length;i++) 
    document.write(obj[i].replace(/s/gi,"*")); 
document.write('<br>'); 

var t3 = new Date().getTime(); 

document.write(obj.join('|').replace(/s/gi,"*").split('|').join('')); // see note 
document.write('<br>'); 

var t4 = new Date().getTime(); 

alert((t2-t1) + ' vs ' + (t3-t2) + ' vs ' + (t4-t3)); 

Примечание: '|' представляет символ (или даже тег), который не включен в элементы объекта и помогает избежать ошибок.

Выберите и выберите.

UPDATE:

Добавлен капитал S в 1-ом испытании.

Интересный случай для изучения: /s/gi.test против IndexOf

+0

Вам нужно проверить индекс 's' или 'S' в 1-м тесте. Хотя ОП не указали это, они сказали в комментарии, что он должен заменить 's' или 'S'. – Jules

+0

Спасибо, но я сделал очень ленивый образец на основе предоставленного кода. Я добавлю «S», что сделает первый тест хуже. –