为什么我的JavaScript函数接受三个数组,而不是一个包含三个数组的数组?

时间:2012-02-21 21:50:45

标签: javascript product cartesian

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 个答案:

答案 0 :(得分:3)

你可以有一个或另一个;否则它的定义很差。 (除非你想做一个非常有问题的决定做特殊套管,比如“如果我的第一个参数是一个数组而且每个元素都是一个数组,那就返回一些不同的东西。”然后你将立即重建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