说我有
arr1 = ["Tom","Harry","Patrick"]
arr2 = ["Miguel","Harry","Patrick","Felipe","Mario","Tom"]
如何删除数组中的重复元素?
我想要这个输出
arr2 = ["Miguel","Felipe","Mario"]
答案 0 :(得分:1)
结合使用filter
和includes
。示例:
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)
所以我认为有多种方法可以实现您想要的,
filter
和include
-
它将起作用,但是我不知道您使用过滤器迭代到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 loop
和splice()
,则可以中断操作,效率会更高。
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;
}
用两个数组处理它。
玩得开心! :)