2013-09-23 19 views
6

属性名をそのままにして、N個の属性のリストに基づいて完全なバリアントセットを生成する必要があります。javascriptのオブジェクトのデカルト積

配列のデカルト積の周りには多くのアルゴリズムがありますが、キーを保持するオブジェクトのためのアルゴリズムはたくさんあります。

パフォーマンスは大きな問題ではありません。各属性には12以上の値がありません。順序は正確にexpectedと一致する必要はありません。

は私がリストのための標準的なアルゴリズムに基づいて、最初の試みを行ってきましたが、私は苦労している:あなたは「『i』はグローバルVaRの問題である」を取り除くたら

function cartesianProduct(input, current) { 
    if (!input || input.length < 1) { 
     return []; 
    } 

    var head = input[0]; 
    var tail = input.slice(1); 
    var output = []; 

    for (var key in head) { 
     for (var i = 0; i < head[key].length; i++) { 
      if (typeof current == 'undefined') { 
       var current = {}; 
      } 

      current[key] = head[key][i]; 
      var productOfTail = cartesianProduct(tail, current); 
      output.push(current); 
      console.log(current); 
     } 
    } 

    return output; 
} 

console.log(cartesianProduct(input)); 
+0

(http://stackoverflow.com/questions/12303989/cartesian-product-of-multiple-arrays-in [同様の質問がここに頼まれました] -javascript) – Keithamus

+0

あなたのコードには大きな問題があります。私はvarとして宣言しないので、グローバル変数とみなされ、したがって変更されますdは内部関数呼び出しで... – GameAlchemist

答えて

4

、あなたを例えば、このコードで結果を得ることができます。

var input = [ 
    { 'colour' : ['red', 'green'] }, 
    { 'material' : ['cotton', 'wool', 'silk'] }, 
    { 'shape' : ['round', 'square', 'rectangle'] } 
]; 

function cartesianProduct(input, current) { 
    if (!input || !input.length) { return []; } 

    var head = input[0]; 
    var tail = input.slice(1); 
    var output = []; 

    for (var key in head) { 
     for (var i = 0; i < head[key].length; i++) { 
      var newCurrent = copy(current);   
      newCurrent[key] = head[key][i]; 
      if (tail.length) { 
       var productOfTail = 
         cartesianProduct(tail, newCurrent); 
       output = output.concat(productOfTail); 
      } else output.push(newCurrent); 
     } 
    }  
    return output; 
} 

function copy(obj) { 
    var res = {}; 
    for (var p in obj) res[p] = obj[p]; 
    return res; 
} 


console.log(cartesianProduct(input)); 
+0

これはうれしいことですが、出力配列に電流を流すことに問題があることが分かりましたが、なぜうまくいかないのでしょうか? –

+0

あなたは大歓迎です。あなたがすでに理解しているように、コピーせずに、各再帰呼び出しで単一のオブジェクトを変更し続けるので、製品は機能しません。 – GameAlchemist

関連する問題