Javascript数组-跨2个数组检查匹配项
我有两个字符串对象数组Javascript数组-跨2个数组检查匹配项,javascript,arrays,Javascript,Arrays,我有两个字符串对象数组 let count = 0; var basket1 = [‘Apples’, ‘Cucumber’, ‘Lettuce’, ‘Bananas’, ‘Pears’, ‘Cauliflower’, ‘Strawberry’] var basket2 = [‘Apples’, ‘Bananas’, ‘Oranges’, ‘Pears’, ‘Pineapple’, ‘Strawberry’] 当篮子1和篮子2中有一个相同的项目时,我想增加计数 注:basket1和bas
let count = 0;
var basket1 = [‘Apples’, ‘Cucumber’, ‘Lettuce’, ‘Bananas’, ‘Pears’, ‘Cauliflower’, ‘Strawberry’]
var basket2 = [‘Apples’, ‘Bananas’, ‘Oranges’, ‘Pears’, ‘Pineapple’, ‘Strawberry’]
当篮子1和篮子2中有一个相同的项目时,我想增加计数
注:basket1和basket2的长度可以不同,因此basket1.length>basket2.length,basket1.lengthbasket.forEach((项目)=>{})循环遍历basket
otherBasket.includes(项目),则计数+++
我只是想知道是否有更有效的方法来实现这一点。如果每个项目在每个数组中只能出现一次,则可以将它们组合到单个数组中,然后计数将是组合数组的总长度-组合数组集的大小(仅限唯一项目)
const basket1=[“苹果”、“黄瓜”、“莴苣”、“香蕉”、“梨”、“花椰菜”、“草莓”]
const basket2=[“苹果”、“香蕉”、“橙子”、“梨”、“菠萝”、“草莓”]
const combled=[…basket1,…basket2];
const count=combined.length-新集合(组合).size;
控制台日志(计数)代码>是,您可以使用检查数组A中的项目是否存在于数组B中
这与使用循环相同,但要干净得多
let count=0;
var basket1=[“苹果”、“黄瓜”、“莴苣”、“香蕉”、“梨”、“花椰菜”、“草莓”]
var basket2=[“苹果”、“香蕉”、“橙子”、“梨”、“菠萝”、“草莓”]
basket1=basket1.filter(项目=>basket2.includes(项目));
计数=篮筐1.5米长
log(basket1,count)
您可以使用这两个数组创建一个组合哈希映射。
然后查找计数就是对组合哈希映射的值求和
e、 g
循环第1个数组并创建一个如下所示的映射:
hashMap={'a':1,'b':1,'c':1}代码>
循环遍历第二个数组并更新哈希映射,如果键存在,则增加值,否则添加一个新条目。然后hashMap如下所示:
hashMap={'a':1,'b':2,'c':2,d:1}代码>
执行一个对象.values(hashMap)
,它给出数组[1,2,2,1]
将这些值相加
使用这种方法,您可以使用O(n)
时间解决它,空间复杂度为O(n1+n2)
,其中n1和n2是两个数组中的项数。这取决于您的情况下“有效”是什么意思。
如果您谈论的是性能,那么可以对数组进行排序。在这种情况下,您可以在一个周期内抛出两个数组。用.filter()
替换.forEach()
到底有什么好处?这与使用循环相同,但这比回答中提到的要干净得多。它真的更有效吗?我还没有分析它,但复杂性是O(n+m)(n-basket1.length,m-basket2.length)vs.O(n*m)带有forEach/过滤器,包括。
const arr1 = ['a', 'b', 'c'];
const arr2 = ['b', 'c', 'd'];