JSFiddle - React, Tailwind, and code Playground

by mgibsonbr

HTML

<ul>
</ul>
<input />
<button>buscar</button>
<button>arvore</button>
<button>\xe1rvore</button>
<button>a\u0301rvore</button>
<br/>
<label><input type="checkbox" checked />Ignorar maiúsculas/minúsculas</label>
<label title="Se checado, acentos no termo de busca casam com palavras não acentuadas também. Se deixado sem, acentos no termo de busca só casam com letras igualmente acentuadas (embora as mesmas podem estar representadas de uma forma diferente)."><input type="checkbox" checked />Ignorar acento no termo de busca</label>
<hr/>
Tempo de preparo: <span>&#x221e;</span> µs (só faz sentido se a lista for grande)
<br/>
Tempo médio de busca: <span>&#x221e;</span> µs (<span>0</span> casos)

CSS

.achou {
    background: lightgray;
}

JavaScript

function preparar(lista) {
    return lista;
}

function prepararTermoBusca(termo) {
    return termo;
}

function comparar(elementoLista, termoBusca) {
    return elementoLista == termoBusca;
}

////// Teste //////

var lista = [
    "acentuacao",
    'arvore',
    '\xe1rvore',
    'a\u0301rvore',
    "divagacão",
    "programaçao",
    "taxação"
];
var listaPreparada = null;

for ( var i = 0 ; i < lista.length ; i++ )
    $("ul").append('<li>' + lista[i] + '</li>');

var buscas = [];

$("button:eq(0)").click(function() {
    var termoBusca = $("input:eq(0)").val();
    $("li").removeClass("achou");
    
    if ( !listaPreparada ) {
        var now = new Date();
        var repetir = 1000000;
        while ( repetir-- > 0 )
            listaPreparada = preparar(lista);
        $("span:eq(0)").text(((new Date() - now)/1000).toFixed(3));
    }
    
    var now = new Date();
    var repetir = 10000;
    while ( repetir-- > 0 ) {
        var termoPreparado = prepararTermoBusca(termoBusca);
        for ( var i = 0 ; i < listaPreparada.length ; i++ )
            if ( comparar(listaPreparada[i], termoPreparado) )
                $("li").eq(i).addClass("achou");
    }
    buscas.push((new Date() - now)/lista.length/10);
    
    var soma = 0;
    for ( var i = 0 ; i < buscas.length ; i++ )
        soma += buscas[i];
    $("span:eq(1)").text((soma / buscas.length).toFixed(3));
    $("span:eq(2)").text(buscas.length);
    
    $("input:eq(0)").val("");
});

$("button:eq(1)").click(function() {
    $("input:eq(0)").val('arvore');
});
$("button:eq(2)").click(function() {
    $("input:eq(0)").val('\xe1rvore');
});
$("button:eq(3)").click(function() {
    $("input:eq(0)").val('a\u0301rvore');
});