You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

函数中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(''))

它分为两种合法的“相似”情况:

  1. ad.length == 0:说明a和b每一个位置的元素都完全相等,两个数组本身就是一模一样的,直接返回true。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:16:34