Почему моя функция JavaScript принимает три массива, а не массив, содержащий три массива? - PullRequest
0 голосов
/ 22 февраля 2012
function product() {
    return Array.prototype.reduce.call(arguments, function(as, bs) {
        return [a.concat(b) for each (a in as) for each (b in bs)]
    }, [[]]);
}


arr4=[['4','4A','4B'],['16D','15D'],['5d','5e']];
alert(product(['4','4A','4B'],['16D','15D'],['5d','5e']);

Выше работает, но не работает:

arr4=[['4','4A','4B'],['16D','15D'],['5d','5e']];
alert(product(arr4);

Спасибо за предложения

1 Ответ

3 голосов
/ 22 февраля 2012

Вы можете иметь либо одно, либо другое; иначе это плохо определено. (Если вы не хотите принять очень сомнительное решение сделать специальный случай типа «если мой первый аргумент - массив, а каждый элемент - массив, верните что-то другое». Тогда вы будете переделывать PHP в кратчайшие сроки. =])


Вместо этого используйте метод somefunction .apply ; это то, для чего это было сделано. Например:

product.apply(this, arr4)

Эквивалентно:

product(arr4[0], arr4[1], ...)

Если вы делаете это много, вы можете определить product2(arrays) {return product.apply(this,arrays)}.


Однако, если вы не хотите сделать и product([..], [..], ..), и product([[..],[..],..]), это выглядит не элегантно.

Если вы хотите, чтобы эта функция по умолчанию работала подобно product([[..],[..],..]), то правильный способ решить эту проблему - изменить функцию в соответствии с вашими потребностями. В настоящее время используется переменная по умолчанию «variadic» (несколько аргументов) arguments, специально предназначенная для javascript, которая представляет собой массив, представляющий все аргументы, которые вы передали в функцию. Это не то, что вам нужно, если вам нужны обычные функции с фиксированным числом аргументов. Сначала добавьте соответствующий параметр:

function product(arrays) {
    ...
}

и вместо использования переменной arguments по умолчанию замените ее на arrays.

...