Return 并以箭头函数格式传递回调

Return and pass a callback in arrow function format

我想要

  1. return 箭头函数和
  2. 将箭头函数传递给另一个函数。

代码:

const NumberValue = {
  GREATER_THAN_0: i => i > 0,
  LESS_THAN_0: i => i < 0,
  EQUAL_TO_0: i => i == 0
};

function printStatistics(...a) {
    for (var key in NumberValue) {
        if (NumberValue.hasOwnProperty(key)) {
          console.log(key + " -> " + sum(NumberValue[key],a));
        }
    }
}

function sum(callback, ...a) {
    return a.filter(callback);
}

console.log(printStatistics(-5, 5, 4, 3, 2, 1, 0, -1));

我正在尝试以下操作: 然后我传递给 printStatistics(...a) 一个 int 数组 我想用一个 int 数组打印 NumberValue 对象的每个键,必须根据存储在 NumberValue 对象的相应值中的每个箭头表达式进行过滤。

我不知道什么不起作用。箭头的 return 是函数还是将它们传递给另一个函数。

预期结果:

GREATER_THAN_0 -> [5,4,3,2,1] LESS_THAN_0 -> [-5,-1] EQUAL_TO_0 -> [0]

但我得到:

GREATER_THAN_0 ->
LESS_THAN_0 ->
EQUAL_TO_0 ->
undefined

简历中

那么我怎样才能 return 并正确传递箭头函数呢?

尝试键入而不是“...a”“[...a] 并给出一个数字数组作为打印统计函数的参数

问题

问题是你使用了...a两次。这是 rest parameters syntax ,它将所有参数变成一个数组。但是,由于它被使用了两次,第一次将参数转换为数组,第二次你只是传递所述数组并将其包装到另一个数组中:

console.log("result:", foo(1, 2, 3));

function foo(...a) { 
  console.log("`a` in foo:", a); // a = [1, 2, 3]
  return bar(a);
}

function bar(...a) {
  console.log("`a` in bar:", a); // a = [[1, 2, 3]] - array inside array
  return a;
}

解决方案

有两种方法可以解决这个问题:

不要使用剩余参数

您可以简单地从第二次调用中删除剩余参数语法,这将避免将数组包装到另一个数组中

console.log("result:", foo(1, 2, 3));

function foo(...a) { 
  console.log("`a` in foo:", a); // a = [1, 2, 3]
  return bar(a);
}

function bar(a) { //no rest parameter syntax
  console.log("`a` in bar:", a); // a = [1, 2, 3] - single array
  return a;
}

const NumberValue = {
  GREATER_THAN_0: i => i > 0,
  LESS_THAN_0: i => i < 0,
  EQUAL_TO_0: i => i == 0
};

function printStatistics(...a) {
    for (var key in NumberValue) {
        if (NumberValue.hasOwnProperty(key)) {
          console.log(key + " -> " + sum(NumberValue[key],a));
        }
    }
}

function sum(callback, a) {
    return a.filter(callback);
}

console.log(printStatistics(-5, 5, 4, 3, 2, 1, 0, -1));

将数组散布到调用中

如果您希望仍然能够调用带有可变数量参数的第二个函数,您可以保留其余参数语法,而是 use spread syntax to make the array into a list of arguments:

console.log("result:", foo(1, 2, 3));

function foo(...a) { 
  console.log("`a` in foo:", a); // a = [1, 2, 3]
  return bar(a);
}

function bar(...a) {
  console.log("`a` in bar:", a); // a = [[1, 2, 3]] - array inside array
  return a;
}

console.log("result:", foo(1, 2, 3));

function foo(...a) { 
  console.log("`a` in foo:", a); // a = [1, 2, 3]
  return bar(...a); //spread syntax
}

function bar(...a) { //rest syntax
  console.log("`a` in bar:", a); // a = [1, 2, 3] - single array
  return a;
}

const NumberValue = {
  GREATER_THAN_0: i => i > 0,
  LESS_THAN_0: i => i < 0,
  EQUAL_TO_0: i => i == 0
};

function printStatistics(...a) {
    for (var key in NumberValue) {
        if (NumberValue.hasOwnProperty(key)) {
          console.log(key + " -> " + sum(NumberValue[key], ...a));
        }
    }
}

function sum(callback, ...a) {
    return a.filter(callback);
}

console.log(printStatistics(-5, 5, 4, 3, 2, 1, 0, -1));