下面的代码检测给定数组arr
中是否有两个项的总和等于变量sum
中给定的值。为了解决此问题,补值(sum-item
)被存储到Set中。
尽管我知道箭头函数以及函数some()
的工作原理,但是语法对我来说还是很晦涩,我很难理解。
const arr = [3,6,7];
const sum = 9;
const findSum = (arr,sum) =>
arr.some((set => n =>
set.has(n) || !set.add(sum-n)) (new Set));
console.log(findSum(arr,sum));
我无法理解(new Set)
函数内部的some
(是IIFE的一种?),以及如何将n
初始化为arr
的项,在我的理解下,代码set
会被初始化到arr
的项目。
有人可以向我解释一下它是如何工作的?
您可以更改格式并查看回调的各个部分。
findSum = (arr, sum) => arr.some(
(set => n => set.has(n) || !set.add(sum - n))
(new Set)
);
您发现两个部分,一个
(set => n => set.has(n) || !set.add(sum - n))
是返回函数的函数表达式。
另一部分是集合的一个实例
(new Set)
立即调用函数表达式(IIFE(immediately-invoked function expression))并充当set
的闭包。
用作回调的最后一部分是
n => set.has(n) || !set.add(sum - n)
它从数组中获取单个值,检查该值是否在集合中或将增量添加到集合中。添加到Set
会返回实例,这是事实。这是不必要的,并且可以避免它阻止迭代的提前退出。
const
arr = [3, 6, 7],
sum = 9,
findSum = (arr,sum) => arr.some(
(set => n => set.has(n) || !set.add(sum - n))
(new Set)
);
console.log(findSum(arr, sum));