使用es6-arrow函数语法检查数组中是否有两个项的总和等于给定值

问题描述 投票:2回答:1

下面的代码检测给定数组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的项目。

有人可以向我解释一下它是如何工作的?

javascript ecmascript-6 arrow-functions
1个回答
1
投票

您可以更改格式并查看回调的各个部分。

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));
© www.soinside.com 2019 - 2024. All rights reserved.