2012-02-21 34 views
0
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']); 

上述作品,但下面不工作:爲什麼我的JavaScript函數接受三個數組,但不是包含三個數組的數組?

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

感謝建議

+0

Plz考慮更新您的問題標題。 – Jeroen 2012-02-21 21:52:53

+1

'[a.concat(b)for each(a in)for each(b in bs)]''是什麼類型的語法?你確定你使用JavaScript,而不是Python? – 2012-02-21 21:58:26

+1

@Rocket:'for each(.. in ..)'是Mozilla支持的JavaScript擴展,它目前不是ECMAScript標準的一部分(只是標準分支的一部分),因此可能不支持非標準Mozilla瀏覽器,例如Chrome或Internet Explorer或Safari。我會提醒不要使用它。它實際上是**非常好的風格,但應該使用'[] .map'和'[] .forEach'和'[] .filter'和'[] .reduce'等來代替,其中*是*符合標準並得到廣泛支持。 (如果你不喜歡使用這些,請使用jQuery稍微破壞的'$ .each'或$ $ .map'。) – ninjagecko 2012-02-21 22:23:58

回答

3

你可以有一個或另一個;否則它的定義很差。 (除非你想做出非常可疑的決定,像「如果我的第一個參數是一個數組,並且每個元素是一個數組,並返回一些不同的東西」,那麼你很快就會重新構造PHP。


改爲使用方法;這就是它的目的。例如:

product.apply(this, arr4) 

等同於:

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

如果你這樣做了很多,你可以定義product2(arrays) {return product.apply(this,arrays)}


但是,除非你想做product([..], [..], ..)product([[..],[..],..]),這似乎不雅。

如果您希望此功能的默認行爲如product([[..],[..],..])那麼解決此問題的正確方法是修改該功能以滿足您的需求。它目前使用默認的「variadic」(多個參數)arguments變量special to javascript,它代表一個數組,代表您傳遞給函數的所有參數。這不是你想要的,如果你想要正常風格的固定數量的參數函數。首先加入適當的參數:

function product(arrays) { 
    ... 
} 

而非使用默認arguments變量,替換成arrays

+0

哇,這個工作!非常感謝 – 2012-02-21 22:02:42

相關問題