如何删除成角度的2个数组之间的重复元素?

时间:2018-09-05 22:26:52

标签: javascript arrays angular typescript angular5

说我有

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

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

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

我想要这个输出

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

9 个答案:

答案 0 :(得分:1)

结合使用filterincludes。示例:

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

答案 1 :(得分:1)

如果有破折号,可以直接使用difference函数。

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

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

答案 2 :(得分:1)

使用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()方法创建一个包含所有通过的元素的新数组   测试由提供的功能实现。

答案 3 :(得分:0)

使用常规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);
  }
}

答案 4 :(得分:0)

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

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

存储重复项的方法是将其值存储在另一个列表中。那取决于你。

一旦您知道重复项,请从列表中重复。

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

答案 5 :(得分:0)

我认为最好的方法是使用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 :(得分:0)

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 :(得分:0)

所以我认为有多种方法可以实现您想要的,

  1. 像我上面提到的那样使用filterinclude- 它将起作用,但是我不知道您使用过滤器迭代到arr2上然后对每个元素进行迭代到arr1上以查看是否存在匹配情况时的效率如何,我不知道您对算法有多熟悉分析,但是它的 O(N幂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中创建一个仅使用对象符号的地图,然后在您的名称数组中进行一次检查,检查是否存在匹配项,则可以使用sort()和其他改进,但想法是,请参见下面的示例。

请参见示例:

  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 :(得分:0)

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

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中的每个元素,如果该元素不在标准Arr中退出,则保留该元素,否则转到下一个元素。

>

以下是函数:

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

用两个数组处理它。

玩得开心! :)