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

上記は機能しますが、以下は機能しません。

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

提案をありがとう

4

1 に答える 1

3

どちらか一方を使用できます。それ以外の場合は、定義が不十分です。(「最初の引数が配列で、各要素が配列の場合、別のものを返す」などの特殊なケースを行うという非常に疑わしい決定を下したくない場合を除きます。そうすれば、すぐに PHP を作り直すことができます。=])


代わりにsomefunction .applyメソッドを使用してください。それがそのために作られたものです。例えば:

product.apply(this, arr4)

以下と同等です。

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

これを頻繁に行うと、 を定義できますproduct2(arrays) {return product.apply(this,arrays)}


ただし、 と の両方 product([..], [..], ..)を実行したい場合を除きproduct([[..],[..],..])、これは洗練されていないように思えます。

この関数をデフォルトで のように動作させたい場合、product([[..],[..],..])これを解決する正しい方法は、ニーズに合わせて関数を変更することです。現在、argumentsjavascript に特別なデフォルトの "variadic" (複数の引数) 変数を使用しています。これは、関数に渡したすべての引数を表す配列を表します。通常のスタイルの引数の固定数関数が必要な場合、これはあなたが望むものではありません。最初に適切なパラメーターを追加します。

function product(arrays) {
    ...
}

デフォルトの変数を使用するのではなく、それをargumentsに置き換えますarrays

于 2012-02-21T21:56:09.340 に答える