Cara, refutando um pouco do uriel, e trazendo um pouco sobre como uma linguagem de programação funciona, acredito ser por um cache de:
item.name.toLowerCase().indexOf(`lars`)
Assim como uma aplicação, se você roda cru, o tempo demora mais, mas se essa função já foi executada antes, a linguagem faz uma memoização dos resultados por um certo tempo para melhorar o desempenho e velocidade. Veja, você usa esse trecho na primeira, o código executa e guarda um cache, e na segunda, já tem o resultado que você espera receber!
Faz muito sentido isso!
Afinal, eu estou percorrendo o objeto results
duas vezes.
Obrigado pela resposta
Até onde sei, as engines não fazem memoização por *default*. Geralmente é algo que vc faz à parte, já que a engine em si não tem como garantir que a função é pura (sem efeitos colaterais), pois aí memoização não é indicado.
Tem que ver também o tamanho do array e os valores que ele contém, pode ter influência no resultado (para poucos dados, costuma ter mais distorções que desaparecem em datasets maiores).
É verdade que muitas engines usam alguma forma de [JIT](https://pt.stackoverflow.com/q/146250/112052) que pode fazer inline de funções e acelerar o processo. Mas isso só costuma acontecer se for executado muitas vezes, então se o array for pequeno, o efeito é mínimo ou até mesmo nulo.
Ou seja, meu palpite é que isso não seja a principal causa da diferença. Sugiro testar com o Benchmark.js ou outra lib similar, para ter resultados mais "limpos" que `console.time`.
Não me refutou, o que você disse não muda o que eu disse em nada, nem uma virgula!
Cada runtime e engine tem suas particularidades e foi isso que eu disse pra ele!