对函数外部可见(反映)的参数进行更改

时间:2017-12-02 11:47:27

标签: javascript arrays google-apps-script

我有一个功能:

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]
}

我得到了原始数组。我用Google搜索了一下,然后发现:

  

对参数的更改在函数外部不可见(反映)。

如何修改实际传递的参数?

注意:

  1. Google表格脚本不支持新的ECMA标准(=>
  2. 我需要能够在函数filterArraysByKeyArray
  3. 中传递任意数量的数组

1 个答案:

答案 0 :(得分:1)

由于您正在创建新的数组,因此您必须有办法将这些数组提供给调用代码。这样做的两种标准方法是:

  1. 使用返回值

  2. 使用可变对象

  3. 在这里#1,我们返回一个数组数组:

    &#13;
    &#13;
    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();
    &#13;
    &#13;
    &#13;

    这里#2,使用数组(数组是可变对象):

    &#13;
    &#13;
    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();
    &#13;
    &#13;
    &#13;