Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript NodeJS-从数组中减去数组,不删除所有重复项_Javascript_Arrays_Node.js - Fatal编程技术网

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