2014-01-06 3 views
0

Я пытаюсь сделать вспомогательные функции, чтобы использовать API Google Analytics, и у меня есть простая проблема с построением строк. Сценарий заключается в том, что я должен применить фильтр, и может быть 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 являются строками, поэтому я предположил, Я посылаю массив строк. Странно, что и , и null в вызове функции buildString apply() дают мне «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(','); 

EDIT: проще еще: toString метод:

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

Js аргумент может быть любого типа, и нет ограничений на количество аргументов,

Но это Рекоммендуемый Используйте 3-4 аргументы в большинство, если есть больше аргументов, вы можете передать его как объект или массив.

Вам не нужно беспокоиться о типе args, 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 имеет множество встроенных функций; например:

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

Cheers

+0

Петля не была единственной проблемой: OP вызывал функцию с помощью '.apply()', которая берет элементы в массиве и передает их как отдельные аргументы. – nnnnnn

+0

Спасибо за разъяснение. Поэтому '.apply()' передает элементы массива в виде отдельных аргументов, чего я не хотел. – artfuldev

+0

Привет Кеншин. Я обновил ответ, чтобы не использовать заявку, или используя 'call' –

Смежные вопросы