Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Quando trabalhamos com arrays em JavaScript, muitas vezes surge a necessidade de verificar se um array contém uma sequência específica de elementos — uma subarray — considerando a ordem, mas sem importar o offset inicial. Essa tarefa, aparentemente simples, pode se tornar um desafio de desempenho e de elegância de código dependendo da abordagem adotada.
O cenário comum é possuir um array principal, que chamaremos de 'master', e uma subarray, 'sub'. Queremos determinar se 'master' contém uma sequência contínua de elementos exatamente igual a 'sub'. Por exemplo, dado:
var master = [12, 44, 22, 66, 222, 777, 22, 22, 22, 6, 77, 3]. var sub = [777, 22, 22].
A resposta deve ser sim, pois essa sequência aparece de forma contínua em 'master'. A complexidade aumenta quando se quer encontrar ocorrências em arrays grandes e múltiplas, sem perder performance. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar.
Uma solução prática e relativamente eficiente se apoia na combinação de Array.indexOf() e Array.every(), utilizando uma variável de controle que mantém a posição de busca na array principal. A ideia é procurar cada elemento de 'sub' na 'master' começando do índice seguinte ao encontrado anteriormente, garantindo a sequência. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar.
function hasSubArray(master, sub) {
let startIndex = 0. return sub.every((element) => {
const index = master.indexOf(element, startIndex). if (index === -1) {
return false. }
startIndex = index + 1. return true. }). } Esse contexto ajuda a separar ganho real de novidade difícil de sustentar.
Esse código verifica elemento por elemento de 'sub', procurando sua ocorrência em 'master' a partir do índice atual, e atualiza esse índice para buscar o próximo elemento subsequente. Assim, garante que a sequência seja contínua. A decisão fica mais saudável quando o time consegue medir o impacto depois. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar.
Apesar de ser uma solução direta, ela assume que a busca sequencial com indexOf() é suficiente para arrays de tamanho moderado. Em arrays muito grandes, esse método pode apresentar problemas de performance, principalmente se houver muitas ocorrências repetidas ou se a busca precisar ser feita muitas vezes. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. A decisão fica mais saudável quando o time consegue medir o impacto depois.
Outra questão é a necessidade de garantir que a sequência seja contínua. Para isso, a busca deve ser exata, e qualquer elemento fora de ordem ou deslocado invalidará a verificação.
Se a performance for uma preocupação crítica, uma alternativa é usar algoritmos de busca de substrings, como o algoritmo de Knuth-Morris-Pratt (KMP), que tem complexidade linear em relação ao tamanho dos arrays. Implementar KMP para arrays de números exige uma adaptação, mas oferece ganhos consideráveis em casos de arrays muito grandes. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco.
1. Avalie o tamanho dos arrays e o custo esperado das buscas.
2. Utilize a abordagem com indexOf() e every() para casos simples e moderados.
3. Para grandes volumes de dados ou necessidade de alta performance, implemente uma busca com algoritmo KMP adaptado para arrays.
4. Teste com diferentes combinações de arrays e verifique a performance.
5. Considere o uso de cache ou indexação prévia se as buscas forem frequentes e os arrays forem relativamente estáticos.
Detectar uma subarray em um array maior no JavaScript não é trivial, mas com as ferramentas certas e compreensão dos tradeoffs, é possível criar soluções elegantes e eficientes. A escolha entre uma abordagem simples e uma mais complexa depende do contexto de uso, tamanho dos arrays e requisitos de performance. Em cenários onde a performance é crítica, investir na implementação de algoritmos como KMP pode fazer toda a diferença, evitando gargalos e otimizando o processamento de dados. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. A decisão fica mais saudável quando o time consegue medir o impacto depois. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta.
Se sua aplicação exige verificações recorrentes de subarrays, uma estratégia de indexação ou uma estrutura de busca otimizada pode ajudar a manter o sistema responsivo sem sacrificar a clareza do código. A decisão fica mais saudável quando o time consegue medir o impacto depois. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. A decisão fica mais saudável quando o time consegue medir o impacto depois.
Exato, o ponto é sempre o tradeoff entre simplicidade e performance.
Boa, essa abordagem com indexOf funciona bem pra arrays pequenos, mas já passei por isso com arrays muito grandes e o desempenho fica complicado. Implementar KMP ou outro algoritmo de busca linear ajuda bastante nessas horas.
No meu time, a gente costuma criar uma indexação prévia se a busca for frequente. Assim, evita repetir buscas caras toda hora. Mas pra um uso pontual, o método do indexOf() seguro e rápido.