这几天看js方法的时候,看到了一个 new Set 的,然后有一段简化的代码一直看不懂,有没有厉害的给我拆一下,给我看一下是怎么简化的
some里面应该是个匿名函数吧,然后里面是个闭包还是什么,麻烦请求一下,看一下怎么分解的
const findSum = (arr, sum) => arr.some((set => n => set.has(n) || !set.add(sum - n))(new Set))
先说一下这一段代码的意义:在 arr
中查找是否存在两个数的和为 sum
。
首先,从里面先拆 (set => n => set.has(n) || !set.add(sum - n))(new Set)
,相当于:
let s = new Set
const f1 = (n => set.has(n) || !set.add(sum - n))
首先这里 s
表示 sum
对 arr
中所有元素做差后的结果。
set.has(n)
意思是,判断 n
是否在集合 s
中,如果有的话,说明之前的某个数和当前的 n
加起来等于 sum
,于是整体函数返回 true。!set.add(sum - n)
就是继续构建 s
的过程,取反的目的是防止其影响 arr.some
的判断到这里,其实应该理解了,其余部分仅仅是 js 的闭包语法问题,最终一个简化版如下:
function findSum(arr, sum) {
let s = new Set
for (let n of arr) {
if (s.has(n)) {
return true
} else {
s.add(sum - n)
}
}
# 如果能运行到这,说明没找到东西
return false
}