Внесите изменения в аргументы, видимые (отраженные) вне функции

1

У меня есть функция:

function filterArraysByKeyArray(key, value)
{
  function check(elt, i) { return value === key[i]; }    
  for (var i = 2, l = arguments.length; i < l; i++) 
  { 
    arguments[i] = arguments[i].filter(check); 
  }
  return 0;
}

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

function test_filterArraysByKeyArray()
{
  var key = [1, 0, 1];
  var value = 1;
  var arr1 = ['M', 'not M', 'L'];
  var arr2 = ['Star Wars', 'booo', 'Stat Trek'];

  filterArraysByKeyArray(key, value, arr1, arr2);

  Logger.log(arr1); // [M, not M, L]
  Logger.log(arr2); // [Star Wars, booo, Stat Trek]
}

В результате я получаю исходные массивы. Я искал это и узнал:

Изменения в аргументах не отображаются (отражаются) вне функции.

Как изменить фактические переданные аргументы?

Заметки:

  1. Сценарий Google Таблиц не поддерживает новые стандарты ECMA (=>)
  2. Мне нужно иметь возможность передавать любое количество массивов внутри функции filterArraysByKeyArray
Теги:
arrays
google-apps-script

1 ответ

1
Лучший ответ

Поскольку вы создаете новые массивы, вам нужно будет вернуть эти массивы вызывающему коду. Два стандартных способа сделать это:

  1. Использовать возвращаемое значение

  2. Использовать изменяемый объект

Здесь # 1, где мы возвращаем массив массивов:

function filterArraysByKeyArray(key, value)
{
  var result = [];
  function check(elt, i) { return value === key[i]; }    
  for (var i = 2, l = arguments.length; i < l; ++i)
  { 
    result.push(arguments[i].filter(check)); 
  }
  return result;
}

function test_filterArraysByKeyArray()
{
  var key = [1, 0, 1];
  var value = 1;
  var arr1 = ['M', 'not M', 'L'];
  var arr2 = ['Star Wars', 'booo', 'Stat Trek'];

  var arrays = filterArraysByKeyArray(key, value, arr1, arr2);
  arr1 = arrays[0];
  arr1 = arrays[1];

  console.log(arrays[0]);
  console.log(arrays[1]);
}

test_filterArraysByKeyArray();

Здесь # 2, используя массив (массивы - изменяемые объекты):

function filterArraysByKeyArray(key, value, arrays)
{
  function check(elt, i) { return value === key[i]; }    
  for (var i = 0, l = arrays.length; i < l; ++i)
  { 
    arrays[i] = arrays[i].filter(check); 
  }
  return 0;
}

function test_filterArraysByKeyArray()
{
  var key = [1, 0, 1];
  var value = 1;
  var arrays = [
    ['M', 'not M', 'L'],
    ['Star Wars', 'booo', 'Stat Trek']
  ];

  filterArraysByKeyArray(key, value, arrays);

  console.log(arrays[0]);
  console.log(arrays[1]);
}

test_filterArraysByKeyArray();

Ещё вопросы

Сообщество Overcoder
Наверх
Меню