Ich habe ein Array mit dem Namen produtosSelecionados .

Ich muss eine Funktion erstellen, bei der bei jedem Aufruf die Elemente produtosSelecionados in das Array produtosConfirmadosAnuncio verschoben werden, aber das Element muss nicht übertragen werden, wenn sich dieses Element bereits in produtoConfirmadosAnuncio befindet .

Ich versuche so etwas wie:

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);
  }

Aber auf diese Weise werden die Elemente in meinem Array produtosConfirmadosAnuncio wiederholt gepusht. Wie kann ich das machen?

1
user10916807 17 Jän. 2019 im 22:36

3 Antworten

Beste Antwort

Ich denke, Sie brauchen nur diesen Code in Ihrer Methode anstelle der verschachtelten Schleife.

Mit der Methode Includes können Sie überprüfen, ob ein Element bereits in einem Array vorhanden ist.

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

In Ihrem Code benötigen Sie speziell Folgendes:

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

Verwenden von for..of

adicionaProdutoConfirmadosAnuncio(){
    for(let product of this.produtosSelecionados){
        if(!this.produtosConfirmadosAnuncio.includes(product)){
            this.produtosConfirmadosAnuncio.push(product);
        }
    }
}
6
Sanyam Goel 31 Jän. 2019 im 15:47

Sie müssen keine Doppelschleife verwenden, dies wirkt sich auf die Effizienz des Codes aus. Du kannst tun:

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
            ]
      }
    }
}

Update: Verwenden Sie dies für bewährte Methoden und mehr Effizienz, um Elemente hinzuzufügen, anstatt zu pushen. Die Methode Push modifiziert das Objekt, und dies ist teurer als das Zuweisen der Variablen, wie in meinem Beispiel.

2
Miquel Angel Barragan Laso 6 Juni 2019 im 23:24

Versuchen

class MyClass {

  constructor() {
    this.produtosSelecionados = [{n:"P1"},{n:"P2"},{n:"P3"}];
    this.produtosConfirmadosAnuncio = [];
    this.produtosConfirmadosAnuncio.push(this.produtosSelecionados[0]) // put p1
  }

  adicionaProdutoConfirmadosAnuncio() {   
    this.produtosSelecionados.forEach( 
      p=> this.produtosConfirmadosAnuncio.includes(p) ? 0 : this.produtosConfirmadosAnuncio.push(p) );
    console.log(this.produtosConfirmadosAnuncio);
  }

}

let p = new MyClass();
p.adicionaProdutoConfirmadosAnuncio();
0
Kamil Kiełczewski 17 Jän. 2019 im 20:07