我可以用一个以上的参数映射一个函数吗?

Can I map a function with more then one argument?

在EE中(Google Earth Engine Javascript API)我可以做到

var listOfNumbers = [0, 1, 1, 2, 3, 5];
print('List of numbers:', listOfNumbers);

var add_ten = function(n) {
  var m = n + 10;
  return m;
}

var listOfNumbers_ = listOfNumbers.map(add_ten);
print('List of numbers:', listOfNumbers_);

如果我想添加 x(或其他值)而不是 10 怎么办?喜欢

var listOfNumbers = [0, 1, 1, 2, 3, 5];
print('List of numbers:', listOfNumbers);

var add_x = function(n, x) {
  var m = n + x;
  return m;
}

var listOfNumbers_ = listOfNumbers.map(add_x);
print('List of numbers:', listOfNumbers_);

如何传递 x

我试过了

var listOfNumbers_ = listOfNumbers.map(add_x(100));
print('List of numbers:', listOfNumbers_);

但是得到了NaN is not a function.

也试过

var listOfNumbers_ = listOfNumbers.map(add_x, 100);
print('List of numbers:', listOfNumbers_);

然后得到如下有趣的结果(我不明白)

0,2,3,5,7,10

您可以简单地编写一个新函数并将其传递给 .map() 方法:

function mapFn(value) { return add_x(value, 100) }
listOfNumbers.map(mapFn)

您可以使用 arrow function syntax 使其更简单:

listOfNumbers.map(value => add_x(value, 100))

这是一个使用currying的方法:

var listOfNumbers = [0, 1, 1, 2, 3, 5];
console.log('List of numbers:', listOfNumbers);

var add_x = (n) => (x) => {
  return n + x;
}

var listOfNumbers_ = listOfNumbers.map(add_x(100));
console.log('List of numbers:', listOfNumbers_);

请注意,add_x 变量设置为以第二个值作为参数调用的函数。

当与 .map() 方法一起使用时,第一个值来自数组,第二个值作为函数的参数提供。相当于这样调用它:

add_x(1)(100)

当您查看 Array#map 的函数签名时,数组总和非常有意义,因为提供给回调函数的前两个参数是迭代的元素和索引。

您至少有两个选择:

  1. Function#bind,作为初始参数的前缀 n 并让 x 成为数组中的元素,
  2. 匿名函数表达式:

例如

const arr = [0, 1, 1, 2, 3, 5];
const r1 = arr.map(add_x.bind(null, n));
const r2 = arr.map(x => add_x(n, x));

如果您不想更改当前函数,则可以使用 partial application via Function#bind 为其提供一个参数而不是另一个参数:

var listOfNumbers = [0, 1, 1, 2, 3, 5];
var add_x = function(n, x) {
  var m = n + x;
  return m;
}

var add_10 = add_x.bind(null, 10);

var listOfNumbers_ = listOfNumbers.map(add_10);

console.log(listOfNumbers_);

甚至:

var listOfNumbers_ = listOfNumbers.map(add_x.bind(null, 10));

或者,您可以使用 currying:

var listOfNumbers = [0, 1, 1, 2, 3, 5];
var add_x = function(n) {
  return function (x){
    var m = n + x;
    return m;
  }
}

var add_10 = add_x(10);

var listOfNumbers_ = listOfNumbers.map(add_10);

console.log(listOfNumbers_);

甚至:

var listOfNumbers_ = listOfNumbers.map(add_x(10));

您可以使用箭头函数缩短柯里化定义:

var add_x = n => x => n+x;