Как я могу преобразовать эту функцию стрелки в стандартную функцию? - PullRequest
0 голосов
/ 28 февраля 2019

У меня есть функция стрелы, любезно предложенная Ele сообщества здесь, но для жизни я не могу понять это:

let isValid = function (arr, arr2) {
    let sum = (array, n) => array.reduce((a, an) => a + (an === n), 0);  
     return !arr2.some(n => !arr.some(an => an === n && sum(arr, an) === sum(arr2, n)))
};

Был бы кто-тотак любезно перевести это в стандартную функцию, чтобы я мог следить за ней на своем уровне квалификации?

Спасибо.

Мое предположение:

function isValid (arr, arr2) {
    ...this is where i'm lost
}

Ответы [ 3 ]

0 голосов
/ 28 февраля 2019

Вы можете использовать https://babeljs.io/ для компиляции из этого нового javscript в «старый» javascript.Вы можете попробовать это прямо на его домашней странице.

Вот вывод, который он дает:

var isValid = function isValid(arr, arr2) {
  var sum = function sum(array, n) {
    return array.reduce(function (a, an) {
      return a + (an === n);
    }, 0);
  };

  return !arr2.some(function (n) {
    return !arr.some(function (an) {
      return an === n && sum(arr, an) === sum(arr2, n);
    });
  });
};
0 голосов
/ 28 февраля 2019

Ваше предположение верно для внешней функции.Первая строка внутри него будет выглядеть так:

function sum(array, n) {
    return array.reduce(function(a, an) {
        return a + (an === n);
    }, 0);

Прочтите о функциях со стрелками и о том, чем они отличаются от обычных объявлений функций.В основном (но не полностью) они являются просто синтаксическим сахаром по сравнению с обычными функциями.

Они отличаются наиболее заметно с точки зрения контекста, то есть того, на что указывает this внутри тела функции.Функции стрелок всегда выполняются во внешнем преобладающем контексте, в котором была объявлена ​​функция.Обычные функции, например, через bind(), могут быть переназначены в другой контекст.

let foo = function() {
    let bar = () => this;
    return bar();
}.bind('a');
foo(); //'a', because foo()'s context is 'a'

Так как насчет этого сахара?Поначалу это может показаться странным, особенно если у вас есть несколько функций стрелок в одной строке.Одна ключевая вещь, которую нужно помнить, это то, что они являются просто неявным сокращением для вещей, которые вы должны были кодировать вручную.

let foo = a => a+1;

То же самое, что

function foo2(a) { return a + 1; }

(подъем будет отличаться, но это немного выходит за рамки этого ответа.)

Одна вещь, которую мы можем сказать из вышесказанного, состоит в том, что, где часть после => является одним оператором, оно интерпретируется как возвращаемое значение, без необходимости писать return.

foo(1); //2

Это отлично подходит для простых функций, которые выполняют одну работу, выражаемую в одной строке кода.Если вам нужно больше подробных функций, вы заключаете код в {} как обычно.

let foo3 = a => {
    return a+1;
};

Это снова работает аналогично foo и foo2 выше.

И так,наконец, ломая эту грозную строку:

    let sum = (array, n) => array.reduce((a, an) => a + (an === n), 0);  

Он говорит:

  • назначить функцию локальной переменной области видимости sum
  • он принимает два аргумента, array и n
  • он выполняет одну работу, выражаемую в виде одной строки кода, и, следовательно, нет необходимости связывать { и } для тела функции.Эта задача состоит в том, чтобы вызвать reduce() и вернуть (неявно) значение
  • Первый аргумент для reduce, обратного вызова, принимает два аргумента, a и an
  • ThisОбратный вызов, как и у reduce, также имеет только одну задачу, и эта задача состоит в том, чтобы вернуть значение a + (an === n)

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

let foo = single_arg => alert(1);
let foo2 = (arg1, arg2) => alert(2);

Надеюсь, это поможет.

0 голосов
/ 28 февраля 2019

Этот подход использует много функций стрелок и может быть переведен в следующие стандартные объявления функций:

let isValid = function(arr, arr2) {
  let sum = function (array, n) {
    return array.reduce(function(a, an) {
      return a + (an === n); // coercion -> true = 1, false = 0
    }, 0);
  };

  return !arr2.some(function(n) {
    let sum2 = sum(arr2, n);
    return !arr.some(function(an) { 
      return an === n && sum(arr, an) === sum2;
    });
  });
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...