下面的代码是如何工作的?
function areSimilar(a, b) {
const ad = a.filter((v,i)=>v!=b[i])
const bd = b.filter((v,i)=>v!=a[i])
return ad.length == 0 || (ad.length == 2 && ad.join('') ==
bd.reverse().join(''))
}
最佳答案
如果您还不知道,filter 是一个高阶数组函数,它将谓词函数作为参数,对数组的每个元素运行该函数,并返回一个仅包含谓词所针对的元素的新数组返回真。更多信息在这里:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter .
在 a.filter((v, i) => v != b[i])
的情况下, 的每个
是否等于 a[i]
正在测试 ab[i]
。如果相等,则过滤掉。生成的数组 ad
将仅包含数组之间不同的 a
元素。与 bd
相同。
如果 ad
的长度为 0,则 a 和 b 之间没有区别,因此函数返回 true。下一部分取决于“相似”的定义——作者的意图似乎是将两个数组标记为相似,如果它们是相同的,或者如果它们具有所有相同的元素,但只有一对元素交换。
如果交换了一对元素,那么 ad 和 bd 中将恰好有两个元素 - 但它们的内容将被交换,因此作者将 bd 反转,然后检查它是否与 ad 相同。
例子:
let a = [1, 2, 3, 4]
let b = [1, 4, 3, 2]
然后,ad == [2, 4]
和 bd == [4,2]
所以 ad.join('') == bd .reverse().join('')
注意:连接是为了让数组可以作为值进行比较,因此最终比较将是 "24"=== "24"
关于javascript - 过滤器在此功能中的作用是什么?我们如何归还我们归还的东西?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58465117/