Передать в функцию обязательный аргумент плюс аргументы переменной длины - PullRequest
1 голос
/ 16 февраля 2020

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

function test(directory, blob0, blob1) {
  for (var argumentIndex = 1; argumentIndex < arguments.length; argumentIndex++) {
    var bytes = arguments[argumentIndex].getBytes();
    //do some things
  }
}

Я использую среду выполнения Rhino, поэтому не могу использовать оператор распространения. Самое близкое, что мне удалось сделать - это использовать функцию apply, но я не уверен, как также передать требуемый параметр (каталог) в тестовой функции выше.

var blobs = [];
blobs[0] = getBlob();
blobs[1] = getBlob();
blobs[2] = getBlob();  

test.apply(null,blobs)  //doesn't set required parameter (directory)

Ответы [ 2 ]

4 голосов
/ 16 февраля 2020
  • Вы хотите использовать массив blobs в качестве расширенных значений blob0, blob1, blob2 при test(directory, blob0, blob1, blob2).
  • . Вы хотите использовать directory при test(directory, blob0, blob1, blob2), добавив directory.

Если мое понимание верно, как насчет этого ответа? Пожалуйста, подумайте об этом как об одном из нескольких возможных ответов.

В этом ответе используется bind.

Модифицированный скрипт:

// sample getBlob(). This returns a blob.
function getBlob() {return Utilities.newBlob("sample", MimeType.PLAIN_TEXT)}

function test(directory, blob0, blob1, blob2) {
  Logger.log("%s, %s, %s, %s", directory, blob0, blob1, blob2) // <--- directory, Blob, Blob, Blob

  for (var argumentIndex = 1; argumentIndex < arguments.length; argumentIndex++) {
    var bytes = arguments[argumentIndex].getBytes();
    //do some things
  }
}

// Please run this function.
function myFunction() {
  var directory = "directory";

  var blobs = [];
  blobs[0] = getBlob();
  blobs[1] = getBlob();
  blobs[2] = getBlob();

  test.bind(this, directory).apply(null, blobs);
}
  • В этот модифицированный сценарий directory добавляется с помощью bind.
  • . При запуске myFunction() вы можете увидеть directory, Blob, Blob, Blob при Logger.log("%s, %s, %s, %s", directory, blob0, blob1, blob2) в функции test(directory, blob0, blob1, blob2).
.

Ссылки:

Если я неправильно понял ваш вопрос, и это не то направление, которое вы хотите, я прошу прощения.

1 голос
/ 16 февраля 2020

Используйте функцию unshift(), она добавляет элемент в начало массива

var blobs = [];
blobs[0] = getBlob();
blobs[1] = getBlob();
blobs[2] = getBlob();

blobs.unshift(directory)

test.apply(null,blobs)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...