Проверьте, есть ли в массиве два элемента, сумма которых равна заданному значению с синтаксисом функции стрелки es6 - PullRequest
3 голосов
/ 10 апреля 2020

Следующий код определяет, есть ли в данном массиве arr два элемента, сумма которых равна значению, указанному в переменной sum. Для решения этой проблемы дополнительные значения (sum-item) сохраняются в наборе.

Хотя я знаю функции стрелок и то, как работает функциональная функция 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.

Кто-то может объяснить мне, как это работает?

Ответы [ 2 ]

3 голосов
/ 10 апреля 2020

Вы можете изменить форматирование и взглянуть на части обратного вызова.

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))

- это выражение функции, которое возвращает function.

Другая часть является экземпляром Set

    (new Set)

, который немедленно вызывает выражение функции (IIFE ( функция немедленного вызова) выражение )) и действует как замыкание над set.

    (set =>                                     )
    (new 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));
1 голос
/ 10 апреля 2020

Хорошо, если мы преобразуем функцию стрелки в обычную, это будет легче понять.

const arrx = [3, 6, 7];
const sum = 9;

 const findSum2 = function(arr, sum) { //  (arr, sum) =>
  let search = function(set) { // set =>
    return function(n) { // n =>
      const r =
        set.has(n) || !set.add(sum - n); // same 
      return r;
    }
  }
  let init = search(new Set); // (..)(new Set) part
  return arr.some(init);
}

console.log(findSum2(arrx, sum));
...