【问题标题】:How can I remove duplicates elements between 2 arrays in angular?如何以角度删除 2 个数组之间的重复元素?
【发布时间】:2019-02-11 03:08:37
【问题描述】:

说我有

arr1 = ["Tom","Harry","Patrick"]

arr2 = ["Miguel","Harry","Patrick","Felipe","Mario","Tom"]

如何删除数组中的重复元素?

我想要这个输出

arr2 = ["Miguel","Felipe","Mario"]

【问题讨论】:

标签: javascript arrays angular typescript angular5


【解决方案1】:

使用常规js,可以使用嵌套的for循环:

for (var i in arr2) {
  var duplicate = false;
  for (var i2 in arr1) {
    if (arr2[i] == arr1.[i2]) {
      duplicate = true;
    }
  }
  if (duplicate) {
    arr2.splice(i, 1);
  }
}

【讨论】:

    【解决方案2】:

    我认为您应该保留一张地图并向该地图添加元素。

    if element exists in map, then that is duplicate else add it to map.
    

    您可以存储重复项的方式是将它们的值存储在另一个列表中。那取决于你。

    一旦你知道你的重复,从列表中复制它。

    这是 O(n) 复杂度和 O(n) 空间复杂度。

    【讨论】:

      【解决方案3】:

      filterincludes 结合使用。示例:

      let arr1 = ["Tom","Harry","Patrick"]
      let arr2 = ["Miguel","Harry","Patrick","Felipe","Mario","Tom"]
      arr2 = arr2.filter(x=>!arr1.includes(x))
      console.log(arr2)

      【讨论】:

        【解决方案4】:

        如果你有lodash,你可以直接使用difference函数。

        _.difference(arr2, arr1) 将提供所需的输出。

        编辑:JSFiddle URL:https://jsfiddle.net/k3ynjq1m/3/

        【讨论】:

          【解决方案5】:

          我认为最好的方法是使用filter() 数组方法,遍历目标数组(在本例中为arr2),并通过!arr1.includes(currentItem) 排除重复项。这个结构让你知道,arr1 是否包含当前的迭代项:

          const arr1 = ["Tom","Harry","Patrick"];
          const arr2 = ["Miguel","Harry","Patrick","Felipe","Mario","Tom"];
          
          const result = arr2.filter(d => !arr1.includes(d));
          console.log(result);

          【讨论】:

            【解决方案6】:
            for(var i = 0 ; i<this.arr1.length; i++) {
                for(var j = 0 ; j<this.arr2.length; j++) {
                    if(this.arr1[i] === this.arr2[j]) {
                        this.arr1.splice(i, 1);
                        this.arr2.splice(j, 1);
                            i--;
                            j--;
                    }
                }
            }    
            this.arr2 = this.arr1.concat(this.arr2);
            console.log(this.arr2)
            

            这是一个工作代码(你的例子):https://stackblitz.com/edit/angular-yzte87

            【讨论】:

              【解决方案7】:

              所以在我看来,有多种方法可以实现您的目标,

              1. 使用filterinclude 就像我上面提到的一些 - 它会起作用,但我不知道当您使用过滤器在 arr2 上迭代然后对于您在 arr1 上迭代的每个元素以查看是否存在匹配的情况时,它的效率如何,我不知道您对算法有多熟悉分析,但它的 O(N power 2) 时间效率不是很高,这意味着随着 arr1 或 arr2 的快速增长,您的函数将需要更长的时间才能运行,如果您确实使用该选项,请先使用sort(),这样可以节省时间并提高效率。

              参见示例:

                let namesToRemove = ["Tom", "Harry", "Patrick"].sort()
                let names = ["Miguel", "Harry", "Patrick", "Felipe", "Mario", "Tom"].sort()
              
                let lastNameToRemove = namesToRemove[namesToRemove.length - 1]
              
                names = names.filter((name) => {
                  if (name[0] > lastNameToRemove[0]) {
                    return true
                  }
              
                  return !namesToRemove.includes(name)
                })
              
                console.log(names)
              

              请记住,如果您将使用 for loopsplice(),您可以直接中断,这样效率会更高。

              1. 使用Map - 你可以在你的第一个数组上迭代一次并在JS中创建一个映射,它只使用一个对象表示法,一次在你的names数组上并检查是否有匹配,你可以使用@987654328改进它@ 和其他改进,但想法是,请参见下面的示例。

              参见示例:

                let namesToRemove = ["Tom", "Harry", "Patrick"]
                let names = ["Miguel", "Harry", "Patrick", "Felipe", "Mario", "Tom"]
              
                let namesToRemoveMap = {}
              
                for (name of namesToRemove) {
                  namesToRemoveMap[name] = true
                }
              
                names = names.filter((name) => !namesToRemoveMap[name])
              
                console.log(names)
              

              当然,无论您选择哪种方式,我都会包括一些更多的防御性检查,例如数组是否具有值等...

              希望我能解释清楚,如果您需要更多帮助或有任何问题,请告诉我。

              【讨论】:

                【解决方案8】:

                使用includes()更好,因为返回true或false,但不幸的是IE不支持,见this。如果你也想在 IE 上运行,你应该使用indexOf()

                var arr1 = ["Tom","Harry","Patrick"]
                
                var arr2 = ["Miguel","Harry","Patrick","Felipe","Mario","Tom"]
                
                arr2 = arr2.filter(e=>arr1.indexOf(e)<0)
                
                console.log(arr2)

                filter 更好,因为:

                filter() 方法创建一个包含所有 通过的元素的新数组 由提供的函数实现的测试

                【讨论】:

                  【解决方案9】:

                  所以你想从另一个数组中删除一个数组中的元素(如果它们存在的话)。 好的,让我们看看...我有一个组件,它实现了一个具有类似逻辑的功能:

                  let criteriaArr = ["Tom", "Harry", "Patrick"];
                  let arrToFilter = ["Miguel","Harry","Patrick","Felipe","Mario","Tom"];
                  
                  let filteredArray = arrToFilter.filter(e => criteriaArr.indexOf(e) < 0);
                  
                  console.log(filteredArray);

                  那么过滤器的作用是:返回数组中满足回调函数指定条件的元素。

                  回调函数的作用是:对于来自arrToFilter的每个元素,如果该元素在criteriaArr中没有退出,则保留它,否则转到下一个元素。

                  这里是函数:

                  removeElems(arrToFilter: Array<any>): Array<any> {
                    let filteredArray = arrToFilter.filter(e => this._criteriaArr.indexOf(e) < 0);
                    return filteredArray;
                  }
                  

                  this._criteriaArr 是一个私有属性,默认值:private _criteriaArr = ["Tom","Harry","Patrick"]

                  或者,你可以这样做:

                  removeElems(arrToFilter: Array<any>, criteriaArr: Array<any>): Array<any> {
                    let filteredArray = arrToFilter.filter(e => criteriaArr.indexOf(e) < 0);
                    return filteredArray;
                  }
                  

                  用两个数组来处理。

                  玩得开心! :)

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2014-09-27
                    • 1970-01-01
                    • 1970-01-01
                    • 2014-11-22
                    • 1970-01-01
                    • 1970-01-01
                    • 2013-12-15
                    • 1970-01-01
                    相关资源
                    最近更新 更多