Могу ли я отобразить функцию с более чем одним аргументом? - PullRequest
1 голос
/ 18 мая 2019

В EE (Google JavaScript Engine Engine 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

Ответы [ 4 ]

3 голосов
/ 18 мая 2019

Если вы не хотите изменять текущую функцию, то вы можете использовать частичное приложение через 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));

В качестве альтернативы вы можете использовать curry :

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;
2 голосов
/ 18 мая 2019

Вот метод с использованием карри :

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)

2 голосов
/ 18 мая 2019

Сумма массива имеет смысл, когда вы смотрите на сигнатуру функции 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));
1 голос
/ 18 мая 2019

Вы можете просто написать новую функцию и передать ее методу .map():

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

Вы можете использовать синтаксис функции стрелки , чтобы сделать его еще проще:

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