Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

Ecmascript - Busca usando json com milhões de objetos

Estamos trabalhando em um projeto com Node.js e uma das funcionalidades é ler um arquivo JSON e buscar alguns e criar uma nova lista, sem criar resultados repetidos.

Atualmente, faço assim:

const result = [];
for(let i=0;i<json.length;i++) {
    const itemJson = json[i];
    let newItem = true;
    for(let j=0;j<result.length;j++) {
        const itemResult = result[j];
        if(itemResult.name == itemJson.name) {
            newItem = false;
            break;
        }
    }

    if(newItem) {
        result.push(Object.assing({}, item));
    }
}

A questão é, será que existe algum outro meio mais performático do que este?

5 respostas

Fala aí Diogo, beleza? Tente dar uma olhada no Set, ele é uma Collection que não permite valores repetidos, ao contrário do Array.

Espero ter ajudado.

Opa Matheus, boa noite.

Fiz um teste aqui e cheguei na seguinte conclusão:

Exemplo 1

let result = new Set([1, 1, 2, 3, 4]);
console.log(result);

retorna:

[1,2,3,4]

Exemplo 2

result = new Set([{id:1},{id:1},{id:2},{id:3},{id:4}]);
console.log(result);

retorna:

[{id:1},{id:1},{id:2},{id:3},{id:4}]

Como resolvo o segundo exemplo?

Fala aí Diogo, verdade, como são objetos com referências diferentes vai repetir mesmo, voltando ao array, verifique se o item já não está na lista, se estiver, você não adiciona:

const list = []
const array = [
    { id: 1, name: 'Matheus' },
    { id: 1, name: 'Matheus' },
    { id: 2, name: 'Henrique' },
    { id: 2, name: 'Henrique' },
    { id: 3, name: 'Castiglioni' }
]

array.forEach(item => {
    if (list.findIndex(i => i.id === item.id) < 0) {
        list.push(item)
    }
})

console.log(list)

Espero ter ajudado

solução!

Opa Matheus, tudo bem?

Mas aí acabo voltando para o primeiro exemplo que expus nesse post. Onde a única diferente é o uso do "forEach" neste caso.

De qualquer forma, obrigado pela ajuda.

Abraços!

Fala Diogo, daria para fazer com Set, basicamente o ifdeveria ser feito do mesmo jeito, isso porque são objetos com referências diferentes.

Abraços