Function similar to indexOf () in JavaScript

0

Assuming I have a string:

  

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent eget leo consectetur, condimentum est eu, convallis dolor. Aliquam fringilla et hatred to congue. Phasellus accumsan, velit in elementum porttitor, massa mi tristique velit, non molestie tellus nisl et odio. Sed id orci mollis ex egestas semper. Cras diam purus, viverra a arcu non, placerat suscipit sapien. Sed suscipit tincidunt urna, in accumsan lacus suscipit a. Suspended ut imperdiet urna, to ultricies ex. Vivamus I pellentesque risus, vitae suscipit hatred. Nam enim leo, auctor nec molestie non, gravida vel felis ... "

And I want to scan this string using an array of strings to find out what "matchs" I find in it, how can I do it in a more performative way than using

indexOf()

follow my code example:

var strErro = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent eget leo consectetur, condimentum est eu, convallis dolor. Aliquam fringilla et odio a congue. Phasellus accumsan, velit in elementum porttitor, massa mi tristique velit, non molestie tellus nisl et odio. Sed id orci mollis ex egestas semper. Cras diam purus, viverra a arcu non, placerat suscipit sapien. Sed suscipit tincidunt urna, in accumsan lacus suscipit a. Suspendisse ut imperdiet urna, a ultricies ex. Vivamus eu pellentesque risus, vitae suscipit odio. Nam enim leo, auctor nec molestie non, gravida vel felis. In pharetra dolor urna, at mattis lectus finibus in. Praesent sed facilisis diam. Pellentesque ornare luctus placerat. Aenean nisl augue, hendrerit ac metus id, fringilla tempor eros. Aliquam erat volutpat. Quisque feugiat, augue vitae cursus scelerisque, libero sem pellentesque neque, non vehicula urna urna vel justo. Curabitur fringilla finibus fringilla. Curabitur fermentum eros vel massa hendrerit euismod. Curabitur scelerisque ipsum a est egestas, accumsan elementum augue interdum. Duis ex turpis, placerat non tincidunt tincidunt, viverra at lorem. Proin sapien nisi, semper in velit quis, egestas placerat eros. Pellentesque non felis auctor massa rhoncus auctor. Aenean feugiat suscipit ex, eu porttitor neque vestibulum nec. Donec sollicitudin euismod vestibulum. Proin varius, ex ac dignissim cursus, enim ex convallis quam, vel porta ante nisl tempor dui. Pellentesque vel facilisis velit, eget pharetra velit. Nulla fermentum vel turpis vel rutrum. Interdum et malesuada fames ac ante ipsum primis in faucibus. Integer mattis metus auctor, volutpat justo sed, porta ante. Donec tincidunt rhoncus urna non finibus. Pellentesque ut venenatis nisi. Praesent bibendum est id sapien consequat, a molestie tellus sollicitudin. Donec nec ligula at est lacinia finibus ac id diam. Praesent efficitur diam eu diam porttitor, quis ullamcorper justo consectetur. Suspendisse lectus enim, ornare venenatis ipsum ac, efficitur sollicitudin enim. Sed at enim tempus, vestibulum arcu et, scelerisque dui. Etiam eu malesuada eros, nec rutrum justo. Cras a odio maximus, tristique nisl at, ullamcorper nibh. Nunc quis interdum magna. Ut et eros ac ligula tristique sodales et iaculis justo. Sed aliquet nulla vitae leo scelerisque, non lacinia odio efficitur. Aliquam mauris magna, dictum nec mauris et, congue viverra ligula. Aliquam vestibulum ligula in augue venenatis viverra. Pellentesque in urna at nulla placerat consectetur a eu arcu. Fusce augue mauris, suscipit vel libero eu, vulputate iaculis nunc. Aenean condimentum neque quis urna egestas, ut feugiat ex efficitur. Morbi vitae ante erat. Fusce pretium quam vel purus maximus, ut rutrum mi volutpat. Cras pellentesque aliquam justo, ut maximus lorem consectetur sit amet. Sed nec leo sed magna scelerisque euismod at eget urna.";


var erros = "";
var found = false;
var ini;
var erro = ["erro1", "erro2", "erro3", "tempor"];

for (var i=0; i<erro.length;i++){

    ini = strErro.indexOf(erro[i]);   

    if (ini!=-1 && found){
        erros+= erro[i]+" ";
    } else if (ini!=-1) {
        erros+= erro[i]+" ";
        found=true;
    }

}

if (!found) {
    strErro;
} else {
    erros;
}
    
asked by anonymous 12.04.2017 / 18:19

4 answers

4
  

And want to scan this string using an array of strings to find out what "matchs" I find in it, how can I do it in a more performative way than using indexOf ()

In case the indexOf is good the way it is, the only thing I would do to improve (it's just micro-optimization) would be to save the total value and reduce one ifs:

for (var i = 0, j = erro.length, current; i < j; i++) {

    current = erro[i];

    if (strErro.indexOf(current) !== -1) {
        erros+= current+" ";
    }
}

found = erros !== ""; //Equivale ao true

Of course saving array values in a variable ( current ) and total .length is only significant if var erro is giant. The 2s ifs part did not make much sense because found=true will be executed only once

An addition

If it is to use .some I believe that regex is totally expendable, could simply do so:

erro.some(function(current) {
    if (strErro.indexOf(current) !== -1) {
        erros += current;
    }
});
    
12.04.2017 / 19:09
5

Benchmark of the proposed functions, should they arise more, I'll update.

Chrome Version 57.0.2987.133 (64-bit)

FirefoxVersion51.0(32-bit)

OperaVersion43.0.2442.1144(64-bit)

    
12.04.2017 / 19:45
0

It's okay to use indexOf , but there's a way to make the code cleaner by using array map

var strErro = "teste teste teste";
var erros = "";
var erro = ["erro1", "erro2", "erro3", "tempor"];

erro.map(function(value){
   if(strErro.indexOf(value) > -1){
      erros+= value+" ";
   }
});

if (erros.length > 0) {   
    erros;
} else {
    strErro;
}
    
12.04.2017 / 18:36
0

Can also be done using array.some (more info here: link )

The some method will go through all the items in the array, hence we can use the values as regular expression to make the comparison easier:

var strErro = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent eget leo consectetur, condimentum est eu, convallis dolor. Aliquam fringilla et odio a congue. Phasellus accumsan, velit in elementum porttitor, massa mi tristique velit, non molestie tellus nisl et odio. Sed id orci mollis ex egestas semper. Cras diam purus, viverra a arcu non, placerat suscipit sapien. Sed suscipit tincidunt urna, in accumsan lacus suscipit a. Suspendisse ut imperdiet urna, a ultricies ex. Vivamus eu pellentesque risus, vitae suscipit odio. Nam enim leo, auctor nec molestie non, gravida vel felis. In pharetra dolor urna, at mattis lectus finibus in. Praesent sed facilisis diam. Pellentesque ornare luctus placerat. Aenean nisl augue, hendrerit ac metus id, fringilla tempor eros. Aliquam erat volutpat. Quisque feugiat, augue vitae cursus scelerisque, libero sem pellentesque neque, non vehicula urna urna vel justo. Curabitur fringilla finibus fringilla. Curabitur fermentum eros vel massa hendrerit euismod. Curabitur scelerisque ipsum a est egestas, accumsan elementum augue interdum. Duis ex turpis, placerat non tincidunt tincidunt, viverra at lorem. Proin sapien nisi, semper in velit quis, egestas placerat eros. Pellentesque non felis auctor massa rhoncus auctor. Aenean feugiat suscipit ex, eu porttitor neque vestibulum nec. Donec sollicitudin euismod vestibulum. Proin varius, ex ac dignissim cursus, enim ex convallis quam, vel porta ante nisl tempor dui. Pellentesque vel facilisis velit, eget pharetra velit. Nulla fermentum vel turpis vel rutrum. Interdum et malesuada fames ac ante ipsum primis in faucibus. Integer mattis metus auctor, volutpat justo sed, porta ante. Donec tincidunt rhoncus urna non finibus. Pellentesque ut venenatis nisi. Praesent bibendum est id sapien consequat, a molestie tellus sollicitudin. Donec nec ligula at est lacinia finibus ac id diam. Praesent efficitur diam eu diam porttitor, quis ullamcorper justo consectetur. Suspendisse lectus enim, ornare venenatis ipsum ac, efficitur sollicitudin enim. Sed at enim tempus, vestibulum arcu et, scelerisque dui. Etiam eu malesuada eros, nec rutrum justo. Cras a odio maximus, tristique nisl at, ullamcorper nibh. Nunc quis interdum magna. Ut et eros ac ligula tristique sodales et iaculis justo. Sed aliquet nulla vitae leo scelerisque, non lacinia odio efficitur. Aliquam mauris magna, dictum nec mauris et, congue viverra ligula. Aliquam vestibulum ligula in augue venenatis viverra. Pellentesque in urna at nulla placerat consectetur a eu arcu. Fusce augue mauris, suscipit vel libero eu, vulputate iaculis nunc. Aenean condimentum neque quis urna egestas, ut feugiat ex efficitur. Morbi vitae ante erat. Fusce pretium quam vel purus maximus, ut rutrum mi volutpat. Cras pellentesque aliquam justo, ut maximus lorem consectetur sit amet. Sed nec leo sed magna scelerisque euismod at eget urna.";

var erros="";
// usadas barras para deixar as strings prontas para serem comparadas com regex
var regexList = [/erro1/, /erro2/, /erro3/, /tempor/];
// verifica os itens do array    
var isMatch = regexList.some(function(rx) { 
  var test = rx.test(strErro);
  if (test) {
    erros += rx.toString().replace('/','').replace('/',' ');
  }
    return; 
});


console.log('erros=' + erros)

The some method runs very fast, and the comparison with regex also. Here you can see a bechmark by comparing the use of for and some and compare performance: link

    
12.04.2017 / 19:01