Javascript NodeJS-从数组中减去数组,不删除所有重复项
标题可能没有多大意义,但您会如何做:Javascript NodeJS-从数组中减去数组,不删除所有重复项,javascript,arrays,node.js,Javascript,Arrays,Node.js,标题可能没有多大意义,但您会如何做: a = [1, 2, 2, 3, 3, 3]; b = [1, 2, 3]; a.subtract(b); 我希望它返回[2,3,3],而不是像其他类似问题的答案那样,它只保留不在另一个数组中的项,而不删除另一个数组中的项。您可以为数组创建原型,并通过检查和删除找到的元素来过滤数组 Array.prototype.subtract=函数(数组){ array=array.slice(); 返回此.filter(函数(a){ var p=数组索引of(a)
a = [1, 2, 2, 3, 3, 3];
b = [1, 2, 3];
a.subtract(b);
我希望它返回[2,3,3],而不是像其他类似问题的答案那样,它只保留不在另一个数组中的项,而不删除另一个数组中的项。您可以为
数组创建原型,并通过检查和删除找到的元素来过滤数组
Array.prototype.subtract=函数(数组){
array=array.slice();
返回此.filter(函数(a){
var p=数组索引of(a);
如果(p==-1){
返回true;
}
阵列拼接(p,1);
});
}
变量a=[1,2,2,3,3,3],
b=[1,2,3];
console.log(a.减去(b))
您可以使用filter()
和indexOf()
检查元素是否存在于其他数组中,以及是否使用splice()删除它
var a=[1,2,2,3,3];
VarB=[1,2,3];
var结果=a.过滤器(函数(e){
设i=b.indexOf(e)
返回i=-1?真:(b.拼接(i,1),假)
})
console.log(result)
有一种方法可以做到这一点:在数组b
中循环,并检查它是否存在于数组a
中。如果是,请在其索引处插入一个未定义的
。返回过滤后的a
数组,以删除所有未定义的元素
编辑:实际上没有必要使用过滤器。其他人使用了splice()
设a=[1,2,2,3,3,3];
设b=[1,2,3];
设sub=函数(a,b){
(b中的i){
设index=a.indexOf(b[i]);
如果(索引!=-1){
a、 拼接([索引],1)
}
}
归还
}
log(sub(a,b))
此处的答案建议使用indexOf()
检查是否存在运行时效率低下。一种更有效的方法是使用A并检查是否存在,将运行时降低到O(n):
//有关比此更有效的实现,请参见答案的底部
Object.defineProperty(Array.prototype,'subtract'{
对,,
值:函数减法(数组){
返回这个.filter(
功能(元素){
const count=this.get(元素)
如果(计数>0){
此.set(元素,计数-1)
}
返回计数===0
},array.reduce(
(地图,元素)=>{
if(映射has(元素)){
map.set(元素,map.get(元素)+1)
}否则{
map.set(元素,1)
}
返回图
},新地图()
)
)
},
可写:对
})
设a=[1,2,2,3,3,3]
设b=[1,2,3]
log(a.subtract(b))
所以只删除第一次出现的第二个数组项?哇,太快了。谢谢我使用了一些类似但有点不同的东西,那就是删除所有重复项,而不是在第二个数组中每次出现一次,比如array.prototype.diff=function(a){returnthis.filter(function(I){return a.indexOf(I)<0;};};我用你更快的版本更新了。它仍然始终比使用Set
慢,但我的解决方案适用于ES5。@NinaScholz不要紧,我以前的答案是无效的。我现在通过改进您的答案的性能进行了更新,当我更正我的答案并切换到使用Map
时,它实际上比您的普通对象方法慢13%。我使用了类似的方法,但没有使用拼接来移除它,而只是从阵列中移除所有它(这不正确):Array.prototype.diff=函数(a){返回this.filter(函数(i){返回a.indexOf(i)<0;});};