Как эффективно добавлять / вставлять элементы в массив, если его еще нет - PullRequest
0 голосов
/ 17 января 2019

У меня есть один массив с именем produtosSelecionados .

Мне нужно создать одну функцию, которая при каждом вызове помещает элементы produtosSelecionados в массив produtosConfirmadosAnuncio , но элемент не должен нажимать, если этот элемент уже находится в produtoConfirmadosAnuncio .

Я пытаюсь что-то вроде:

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

Но таким образом элементы толкаются в моем массиве produtosConfirmadosAnuncio . Как я могу это сделать?

Ответы [ 3 ]

0 голосов
/ 17 января 2019

Вам не нужно использовать двойной цикл, это влияет на эффективность кода. Вы можете сделать:

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

Обновление: Для хорошей практики и большей эффективности используйте это для добавления элементов вместо push. Метод push модифицирует объект, и это дороже, чем присваивать переменную, как в моем примере.

0 голосов
/ 17 января 2019

Попробуйте

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 голосов
/ 17 января 2019

Я думаю, вам нужен этот код внутри вашего метода вместо вложенного цикла.

Включает метод, помогающий проверить, существует ли элемент в массиве.

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

В вашем коде конкретно вам нужно это:

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

Использование for..of

adicionaProdutoConfirmadosAnuncio(){
    for(let product of this.produtosSelecionados){
        if(!this.produtosConfirmadosAnuncio.includes(product)){
            this.produtosConfirmadosAnuncio.push(product);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...