Javascript 如何删除引用数组的额外引用

Javascript 如何删除引用数组的额外引用,javascript,Javascript,假设我们有两个这样的数组: let s1 =  ["A", "B", "C", "D", "B"] // Note: "B" has been occurred 2 times let s2 = ["A", "B", "C", "D", "B", "A", "X", "Y"] // // Note: "B" has been occurred 2 times just like s1 but we have another occurrence for "A" 我想创建一个新的数组,让s

假设我们有两个这样的数组:

let s1 =  ["A", "B", "C", "D", "B"]  // Note: "B" has been occurred 2 times
let s2 =  ["A", "B", "C", "D", "B", "A", "X", "Y"] // // Note: "B" has been occurred 2 times just like s1 but we have another occurrence for "A" 
我想创建一个新的数组,让s3基于这两个数组,根据这个规则,我们将删除出现次数多于数组s1中相同元素出现次数的元素

因此,s3阵列如下所示:

let s3 =  ["A", "B", "C", "D", "B", "X", "Y"] // we just removed "A" cause it occurred more than "A" occurances in s1
请注意,我们需要任何其他的X,Y。我们只想处理额外的事件

到目前为止,我可以找到像这样重复出现的索引,但我找不到一种方法来比较每一次出现,看看它是否是一个额外的或不复杂的:

设s1=[A,B,C,D,B] 设s2=[A,B,C,D,B,A,X,Y] var s3=[]; 对于let i=0;ilogs3由于您希望将所有内容最初保留在s1中,但仅添加s2中尚未包含的项目,因此可以首先将s3设置为s1。然后循环s2,如果s1没有该值,则将其推入s3

常数s1=[A,B,C,D,B]; 常数s2=[A,B,C,D,B,A,X,Y]; 常数s3=[…s1]; s2.forEachd=>{ 如果!s1.includesd s3.pushd; };
console.logs3 由于您希望将所有内容最初保留在s1中,但如果s2中的项目尚未包含在s1中,则仅添加s2中的项目,因此最初可以将s3设置为s1。然后循环s2,如果s1没有该值,则将其推入s3

常数s1=[A,B,C,D,B]; 常数s2=[A,B,C,D,B,A,X,Y]; 常数s3=[…s1]; s2.forEachd=>{ 如果!s1.includesd s3.pushd; };
console.logs3 您可以计算第一个集合的值并返回给定计数的值,如果不知道,则返回所有项

变量s1=[A,B,C,D,B], s2=[A,B,C,D,B,A,X,Y], count=s1.reduceem,v=>m.setv,m.getv | | 0+1,新映射, s3=s2.filterv=>count.getv?count.setv,count.getv-1:!count.hasv;
console.log…s3 您可以计算第一个集合的值并返回给定计数的值,如果不知道,则返回所有项

变量s1=[A,B,C,D,B], s2=[A,B,C,D,B,A,X,Y], count=s1.reduceem,v=>m.setv,m.getv | | 0+1,新映射, s3=s2.filterv=>count.getv?count.setv,count.getv-1:!count.hasv; console.log…s3 您可以使用映射和过滤器

首先将数组1映射为[key,value]格式 迭代第二个数组,如果在Map中找到它,并且值大于零,则返回true,否则返回false, 如果未找到,则返回true 设s1=[A,B,C,D,B] 设s2=[A,B,C,D,B,A,X,Y] 让map=newmap s1.forEachv=>{ ifmap.hasv{ map.setv,map.getv+1 }否则{ 地图,setv,1 } } 设final=s2.filterval=>{ ifmap.hasval{ ifmap.getval{ map.setval,map.getval-1 返回真值 } 返回错误 } 返回真值 } console.logfinal您可以使用Map和filter

首先将数组1映射为[key,value]格式 迭代第二个数组,如果在Map中找到它,并且值大于零,则返回true,否则返回false, 如果未找到,则返回true 设s1=[A,B,C,D,B] 设s2=[A,B,C,D,B,A,X,Y] 让map=newmap s1.forEachv=>{ ifmap.hasv{ map.setv,map.getv+1 }否则{ 地图,setv,1 } } 设final=s2.filterval=>{ ifmap.hasval{ ifmap.getval{ map.setval,map.getval-1 返回真值 } 返回错误 } 返回真值 }
console.logfinalthank的评论迈克尔,但它是不同的。。。我可以简单地使用s2=[…new Sets2]删除重复的元素,但我还需要其他东西…抱歉,请重新阅读问题。您需要数组的名称。这就是您要寻找的答案吗?谢谢我会试试这些…谢谢你的评论,迈克尔,但它是不同的。。。我可以简单地使用s2=[…new Sets2]删除重复的元素,但我还需要其他东西…抱歉,请重新阅读问题。您需要数组的名称。这就是您要寻找的答案吗?谢谢我会试试这些…很好的捷径,但是如果第一个包含的元素不在第二个呢?多好的捷径啊@NinaScholz,因为OP明确表示他们只希望添加额外的事件,所以我是这样做的。否则,不在第二个快捷方式中的元素将不会被处理。只需将s1解构更改为consts3=[…s1.filters=>s2.includess];很好的捷径,但是如果第一条包含的元素不在第二条中呢?多么好的捷径啊@NinaScholz,因为OP明确表示他们只希望添加额外的事件,所以我是这样做的。否则,不在第二个快捷方式中的元素将不会被处理。只需将s1解构更改为consts3=[…s1.filters=>s2.includess];