2014-01-06 40 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' –

相關問題