2014-01-06 35 views
0

我在尝试使用帮助函数来利用Google Analytics API,并且我有一个构建字符串的简单问题。场景是,我必须应用一个过滤器,并且可能有n个过滤器(标称量,不超过128)。我想写一个函数,它可以接收n个字符串并将它们与逗号分隔结合起来。如何将数组作为参数传递给JavaScript中的函数?

我不知道参数的数量是否可以在javascript中变量,以及它是否可以将数组作为参数在JavaScript中(我是JS的新手),但我没有看到任何区别,因为变量只是var和在JS的任何地方都没有数据类型(我来自C++/Java背景,发现它很混乱)。所以我试着将一个数组作为参数传递给一个函数,我可以使用的东西可以是动态的,由数组中的元素决定。

当我开始寻找解决方案时,我碰到this page。在那之后,我最近遇到了this thread,它也提到了同样的链接,他们提供的格式对我来说并不好。

为了清楚起见,让我提供我写的函数定义。

/** 
* Utility method to build a comma-ed string from an array of strings 
* for the multiple-condition requests to the GA API 
*/ 
function buildString(strArray) 
{ 
    var returnString=''; 
    for(var x in strArray) 
     returnString+=x+','; 
    return returnString = returnString.substring(0, returnString.length - 1); 
} 

这是我怎么称呼它:

buildString.apply(this,[desc(visits),source]) 

其中desc(visits)source都是字符串,所以我假设我送一个字符串数组。奇怪的是,thisnullapply()调用buildString函数给我“0,1”作为返回值。

请告诉我我哪里出错了。我是否以错误的方式传递数组?或者我的函数定义错了?还是有其他更简单的方法来实现我正在尝试的?

+0

对于变量参数检查http://stackoverflow.com/questions/2141520/javascript-variable-number-of-arguments-to-function/2141530#2141530,你可以传递一个数组o r任何类型的对象作为JS中的参数。 –

+0

如果您想将数组转换为逗号分隔的字符串,请使用'array.join(',')'。 – Barmar

+0

你使用你的函数的方式就是'buildString(someArray)'。 – Barmar

回答

4

向函数传递数组是从通过任何其它类型的没有不同:

var string = buildString([desc(visits), source]); 

然而,你的功能是不必要的,因为使用Javascript具有用于级联阵列元件与分隔符内置功能:

var string = someArray.join(','); 
2

你在复杂的事情 - JavaScript数组有一个内置join方法:

[ desc(visits), source ].join(','); 

编辑:简单一些:在toString方法:

[ desc(visits), source ].toString(); 
0

的js参数可以是任何类型和没有限制的参数的数量,

但它是在建议报告使用3-4参数大多数情况下,如果有更多参数,可以将它作为对象或数组传递。

你不需要担心参数的类型,js会完成这项工作。

例如:

var func1 = function(a) { 
    console.log(a); 
} 

func1('good'); 
func1(1); 
func1(['good', 'a', 1]); 
func1({name: 'fn1', age: 12}); 

任何你喜欢的!

你甚至可以定义一个函数有三个参数,但只传递一个就行了!

var func2 = function(a, b, c) { 
    console.log(a); 
} 

func2(1); 
func2(1, 'good'); 
func2(1, 'good', 'night', 4); 

而默认数组obj有许多内建func;例如:

var arr = ['good', 'night', 'foo', 'bar']; //define any thing in a array 
str = arr.join(','); //you may get 'good,night,foo,bar' 
var arr1 = str.split(','); // you may get ['good', 'night', 'foo', 'bar']; 
0

最简单的办法是使用内置的join方法:

[desc(visits), source].join(','); 

无论如何,你的问题是在for..in循环取而代之的是

for(var x in strArray){ 
    returnString+=x+','; 
} 

你应该有:

for(var i in strArray){ 
    var x = strArray[i]; //Note this 
    returnString+=x+','; 
} 

因为对于...在还给索引/键,还不如foreach实际元素确实在其他语言

而且您的电话应该是:

buildString.call(this,[desc(visits),source])或只是buildString([desc(visits),source])

干杯

+0

循环不是唯一的问题:OP使用'.apply()'调用函数,该函数接受数组中的元素并将它们作为单独的参数传递。 – nnnnnn

+0

感谢您的澄清。因此'.apply()'将数组的元素作为单独的参数传递,这不是我想要的。 – artfuldev

+0

嗨Kenshin。我更新了不使用apply的答案,或者使用'call' –

相关问题