Javascript 如何将此箭头函数转换为标准函数?

Javascript 如何将此箭头函数转换为标准函数?,javascript,function,Javascript,Function,我有一个箭的功能,这里的社区成员很慷慨地提供了这个功能,但就我个人而言,我无法理解它: 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) === su

我有一个箭的功能,这里的社区成员很慷慨地提供了这个功能,但就我个人而言,我无法理解它:

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
}

该方法使用了大量箭头函数,可以转换为以下标准函数声明:

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

该方法使用了大量箭头函数,可以转换为以下标准函数声明:

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;
    });
  });
};
您可以使用从这个新脚本编译为“旧”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);
    });
  });
};
您可以使用从这个新脚本编译为“旧”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);
    });
  });
};

对于外部函数,您的假设是正确的。其中的第一行是:

function sum(array, n) {
    return array.reduce(function(a, an) {
        return a + (an === n);
    }, 0);
以及它们与传统函数声明的区别。大多数情况下(但不完全),它们只是语法上的糖类和常规功能

它们在上下文方面差异最大,即
指向函数体内部的内容。Arrow函数始终在声明函数的外部流行上下文中运行。传统函数,例如通过
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
  • 这个回调,就像reduce的回调一样,也只有一个任务要做,这个任务就是返回
    a+(an==n)
关于sugar的最后一个词,您可能已经在上面看到了,就是,对于箭头函数,如果只接受一个参数,则不需要将其括在括号中。不过,多个参数通常用逗号分隔

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

希望这有帮助。

您的假设对于外部函数是正确的。其中的第一行是:

function sum(array, n) {
    return array.reduce(function(a, an) {
        return a + (an === n);
    }, 0);
以及它们与传统函数声明的区别。大多数情况下(但不完全),它们只是语法上的糖类和常规功能

它们在上下文方面差异最大,即
指向函数体内部的内容。Arrow函数始终在声明函数的外部流行上下文中运行。传统函数,例如通过
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
  • 这个回调,就像reduce的回调一样,也只有一个任务要做,这个任务就是返回
    a+(an==n)
关于sugar的最后一个词,您可能已经在上面看到了,就是,对于箭头函数,如果只接受一个参数,则不需要将其括在括号中。不过,多个参数通常用逗号分隔

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

希望这有帮助。

函数(arr,arr2)
替换
(arr,arr2)=>
。重复同样的模式。等等,我是这个的创造者。事实上,你是!我再次为此感谢你,我很难为情地说你的技术远远超过我自己。我只需要一个更标准的翻译,这样我就可以从中学习并扩展我的能力