函数中filter方法的作用、返回逻辑及areSimilar函数工作原理咨询
解析areSimilar函数的工作原理(含filter方法作用说明)
让我一步步拆解这个函数,帮你搞清楚它的逻辑:
先说说filter方法在这里的作用和返回逻辑
这里用到的两个filter都是数组原生方法,核心作用是筛选出满足指定条件的元素,返回一个新数组,不会修改原数组。具体到这个函数里:
a.filter((v,i)=>v!=b[i]):遍历数组a的每一个元素v及其对应的索引i,当当前元素v和数组b同索引位置的元素不相等时,就把这个v加入到新数组ad中。简单说,ad就是把a里所有和b同位置不匹配的元素挑了出来。b.filter((v,i)=>v!=a[i]):逻辑和上面完全对应,只不过是从b里挑出所有和a同位置不匹配的元素,存到bd数组里。
整个areSimilar函数的工作原理
这个函数的核心目的是判断两个数组a和b是否属于「相似数组」——这里的相似规则是:要么两个数组完全一致,要么只需要交换恰好一对元素的位置,就能让两个数组完全相同。
我们来看返回语句的逻辑:
return ad.length == 0 || (ad.length == 2 && ad.join('') == bd.reverse().join(''))
它分为两种合法的“相似”情况:
- ad.length == 0:说明
a和b每一个位置的元素都完全相等,两个数组本身就是一模一样的,直接返回true。 - ad.length == 2 且反转后的bd和ad内容一致:
- 当
ad的长度是2时,说明a和b恰好有两个位置的元素不匹配。这时候我们需要验证:这两个不匹配的元素是不是刚好可以通过互换位置让两个数组匹配。 - 举个例子:如果
a是[1,2,3],b是[1,3,2],那么ad会是[2,3],bd会是[3,2]。把bd反转后得到[2,3],和ad转成字符串后完全一致,说明这两个位置的元素刚好是对方的镜像,交换一次就能匹配,所以返回true。 - 如果
ad长度不是0也不是2(比如是1或者3),说明要么有单个元素不匹配(无法通过交换解决),要么有超过两个位置不匹配(需要多次交换),这时候就会返回false。
- 当
举个反例:如果a = [1,2,3],b = [1,4,2],ad是[2,3],bd是[4,2],反转bd后是[2,4],和ad的字符串"23"不相等,所以返回false,符合预期——因为这两个数组需要两次交换才能匹配,不符合“仅交换一对”的规则。
内容的提问来源于stack exchange,提问作者Jackooo
相关产品推荐
相关产品推荐

