Búsqueda de sitios web

javascript - Cómo agregar/enviar eficientemente elementos a un arreglo si no están presentes


Tengo un arreglo con el nombre produtosSelecionados.

Necesito crear una función que en cada llamada agregue los elementos produtosSelecionados al array produtosConfirmadosAnuncio, pero el elemento no se debe agregar si este elemento ya está en produtosConfirmadosAnuncio.

Intento algo así:

adicionaProdutoConfirmadosAnuncio(){
    for(let i=0;i<this.produtosSelecionados.length;i++){
      for(let j=i+1;j<this.produtosSelecionados.length;j++){
        if(this.produtosSelecionados[i] !== this.produtosSelecionados[j]){
          this.produtosConfirmadosAnuncio.push(this.produtosSelecionados[i]);
        }
      }
    }
    console.log(this.produtosConfirmadosAnuncio);
  }

Pero de esta manera los elementos se están repitiendo en mi array produtosConfirmadosAnuncio. ¿Cómo puedo hacer esto?

Respuesta #1

Creo que solo necesitas este código dentro de tu método en lugar del bucle anidado.

El método Includes ayuda a comprobar si un elemento ya existe en un arreglo.

if(!yourArray.includes(element){
    yourArray.push(element);
}

En tu código específicamente necesitas esto:

adicionaProdutoConfirmadosAnuncio(){
    for(let i=0;i<this.produtosSelecionados.length;i++){
        if(!this.produtosConfirmadosAnuncio.includes(this.produtosSelecionados[i])){
            this.produtosConfirmadosAnuncio.push(this.produtosSelecionados[i]);
        }
    }
}

Usando for..of

adicionaProdutoConfirmadosAnuncio(){
    for(let product of this.produtosSelecionados){
        if(!this.produtosConfirmadosAnuncio.includes(product)){
            this.produtosConfirmadosAnuncio.push(product);
        }
    }
}

Respuesta #2

No necesitas usar bucle doble, esto afecta la eficiencia del código. Puedes hacer:

adicionaProdutoConfirmadosAnuncio(){
    for(let producto of this.productosSeleccionados) {
          //indexOf return -1 if the item don't exist in the array
          if(this.productosConfirmadosAnuncio.indexOf(producto) === -1){
            this.productosConfirmadosAnuncio = [
                ...this.productosConfirmadosAnuncio,
                producto
            ]
      }
    }
}

Actualización: Para buenas prácticas y más eficiencia, use esto para agregar elementos en lugar de push. El método push modifica el objeto, y esto es más costoso que asignar la variable, como en mi ejemplo.