【问题标题】:Javascript dealing with unkown number of function arguments [duplicate]处理未知数量的函数参数的Javascript [重复]
【发布时间】:2016-04-07 14:36:24
【问题描述】:

我的函数需要接受任意数量的列表,然后输出它们的对称差。 sym([1, 2, 3], [5, 2, 1, 4]) 应该返回 [3, 5, 4]sym([1, 2, 5], [2, 3, 5], [3, 4, 5]) 应该返回 [1, 4, 5]。如何处理未知数量的参数?我以为我可以使用单个变量 args 来创建列表列表,但这不起作用。

function isin(num,arra)
{
  for (i=0; i<arra.length; i++)
  {
    if (num == arra[i]){return true;}
  }
  return false;
}

function sym(args) {
   var syms = [];
   console.log(args);
   for (i=0; i<args.length; i++)
   {
     var ins = false;
     for (j=0; j<args[i].length; j++)
     {
       for (k=i+1; k < args.length; k++)
       {
         if(isin(args[i][j], args[k]))
         {
           ins = true;
         }
       }
     }
     if (ins === false)
     {
       syms.push(args[i][j]);
     }
   }
  return syms;
}
sym([1, 2, 3], [5, 2, 1, 4]);

【问题讨论】:

  • 我需要将列表作为多个参数传递

标签: javascript


【解决方案1】:

使用arguments,而不是args

而且你不需要在函数定义中包含它。

(注意:我假设你的其余代码在你真正得到你期望的东西后工作)

所以:

function sym() {
   var syms = [];
   console.log(arguments);
   for (i=0; i<argumentss.length; i++)
   {
     var ins = false;
     for (j=0; j<arguments[i].length; j++)
     {
       for (k=i+1; k < arguments.length; k++)
       {
         if(isin(arguments[i][j], arguments[k]))
         {
           ins = true;
         }
       }
     }
     if (ins === false)
     {
       syms.push(arguments[i][j]);
     }
   }
  return syms;
}

【讨论】:

    【解决方案2】:

    对于带有数字的数组:

    function sym() {
      var temp = {}, res = [];
    
      for (var q=0; q<arguments.length; ++q) {
        for (var w=0; w<arguments[q].length; ++w) {
          temp[arguments[q][w]] ^= 1;
        }
      }
    
      for (var key in temp) {
        if (temp[key] === 1) {
          res.push(+key);
        }
      }
    
      return res;
    }
    
    console.log(sym([1, 2, 3], [5, 2, 1, 4]), sym([1, 2, 5], [2, 3, 5], [3, 4, 5]))
    

    【讨论】:

    • 为什么要使用异或^
    • @kilojoules,因为据我所知,数字应该包含在奇数个数组中。也按位运算会将不存在的字段转换为 0。
    【解决方案3】:

    Es6 引入了rest paramters。您可以使用它来代替 arguments 对象。

    function logAllArguments(...args) {
        for (var arg of args) {
            console.log(arg);
        }
    }
    
    logAllArguments(1,2,3)
    

    【讨论】:

      【解决方案4】:

      在每个函数范围内,您都可以访问参数对象。您传入的任何参数都将在其中可用。您可以使用 Array.prototype.slice.apply(null,arguments) 将 arguments 对象转换为数组,并对其进行迭代。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-12-15
        • 2011-09-20
        • 1970-01-01
        • 2022-08-09
        • 2015-08-22
        • 2012-08-11
        • 1970-01-01
        • 2011-05-06
        相关资源
        最近更新 更多