Javascript 如何在JS中从数组中删除一个子集?

Javascript 如何在JS中从数组中删除一个子集?,javascript,arrays,Javascript,Arrays,假设我有一个数组,比如:[1,1,2,2,3,3,4,5] 我想删除这个元素数组[1,2,3,4,5] 所以最后我想留下[1,2,3] 我尝试过使用下面的方法,但它会从主数组中删除元素的所有副本 myArray = myArray.filter( function( el ) { return !toRemove.includes( el ); } ); 您可以使用和 让arr=[1,1,2,2,3,3,4,5] 让remove=[1,3,2,4,5]。排序((a,b)=>a-b) 让o

假设我有一个数组,比如:
[1,1,2,2,3,3,4,5]

我想删除这个元素数组
[1,2,3,4,5]

所以最后我想留下
[1,2,3]

我尝试过使用下面的方法,但它会从主数组中删除元素的所有副本

myArray = myArray.filter( function( el ) {
  return !toRemove.includes( el );
} );
您可以使用和

让arr=[1,1,2,2,3,3,4,5]
让remove=[1,3,2,4,5]。排序((a,b)=>a-b)
让op=arr.sort((a,b)=>a-b).filter(e=>(remove.includes(e)?(remove.shift(),false):true))

console.log(op)
一个解决方案是在要删除的元素数组上循环,并且对于每个元素,删除输入数组上找到的第一个元素:

const input=[1,1,2,2,3,3,4,5];
常量removeItems=(输入,项)=>
{
//制作一个副本,不改变输入。
让clonedInput=input.slice();
//搜索并删除项目。
items.forEach(x=>
{
设i=clonedInput.findIndex(y=>y==x);
如果(i>=0)克隆输入拼接(i,1);
});
返回克隆输入;
}
日志(删除项(输入[1,2,3,4,5]);
log(removitems(输入[1,2]);

日志(removitems(输入[1,99,44,5])您可以获得一个
映射图
并通过检查计数和减少计数(如果找到)来计算值和过滤

var数组=[1,1,2,2,3,3,4,5],
删除=[1,2,3,4,5],
map=remove.reduce((m,v)=>m.set(v,(m.get(v)| | 0)+1),新map),
result=array.filter(v=>!map.get(v)| |!map.set(v,map.get(v)-1));

控制台日志(结果)这里有一种方法可以使用
过滤器
索引
拼接

const input=[1,1,2,2,3,3,4,5];
函数removeSubset(arr,子集){
常量排除=[…子集];
返回arr.filter(x=>{
const idx=exclude.indexOf(x);
如果(idx>=0){
不包括。拼接(idx,1);
返回false;
}
返回true;
});
}

log(removeSubset(输入[1,2,3,4,5])两个数组是否总是排序?创建一个对象,该对象将第一个数组值作为键,该值的数量作为值,对于第二个数组,从第一个数组的每个键中减去1array@MarkMeyer不,不一定排序。“我想删除这个元素数组”您的意思是从原始数组中删除元素,还是返回一个仅包含
中未包含的元素的新数组以删除
?是
myArray=myArray.filter()
故意重新定义
myArray
,作为返回新数组的
.filter()
的结果吗?要删除的元素数组在哪里?什么是只想删除元素
[1,2]
?这现在只在删除数组排序的情况下起作用,这就是为什么我在评论中问到它的原因。是的,这似乎是在不增加二次复杂性的情况下做到这一点的最合理的方法。