【问题标题】:How to efficiently add/push elements to an array if not already present如果尚未存在,如何有效地将元素添加/推送到数组
【发布时间】:2019-01-17 19:36:30
【问题描述】:

我有一个名为 produtosSelecionados 的数组。

我需要创建一个函数,每次调用都将元素 produtosSelecionados 推送到数组 produtosConfirmadosAnuncio,但如果该元素已经在 produtosConfirmadosAnuncio 中,则该元素不必推送strong>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 中重复推送。我该怎么做?

【问题讨论】:

  • 你的数组元素有什么类型?有不同的规则用于比较原语和对象developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
  • 如果以下内容正是您要找的,请告诉我
  • 如果元素已经存在于你的数组中,你应该使用 include 方法
  • 使用一个Set作为数据结构,可能不会保持顺序,但不会出现重复。

标签: javascript angular typescript ecmascript-6


【解决方案1】:

我认为您只需要在方法中使用此代码来代替嵌套循环即可。

Includes 方法有助于检查元素是否已存在于数组中。

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

用于..of

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

【讨论】:

    【解决方案2】:

    你不需要使用双循环,这会影响代码的效率。你可以这样做:

    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 方法修改对象,这比分配变量更昂贵,如我的示例。

    【讨论】:

      【解决方案3】:

      试试

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-07-17
        • 1970-01-01
        • 2015-02-08
        • 2012-05-11
        • 1970-01-01
        • 2020-10-25
        • 2021-12-31
        • 1970-01-01
        相关资源
        最近更新 更多