2012-02-04 4 views
2

未知数の配列とその値のすべての値をペアにしようとしています。以下は未知数の配列と値のすべての値をペアにする再帰的メソッド

私のJSONです:

{"AttributeGroups": 
[ 
    {"Name":"Color","Attributes": 
     [ 
     {"Name":"Grey"}, 
     {"Name":"Blue"}, 
     {"Name":"Pink",} 
     ] 
    }, 
    {"Name":"Size","Attributes": 
     [ 
      {"Name":"XXS"}, 
      {"Name":"XS"}, 
      {"Name":"S"}, 
      {"Name":"M"}, 
      {"Name":"L"}, 
      {"Name":"XL"}, 
      {"Name":"XXL"} 
     ] 
    }, 
    {"Name":"Cut","Attributes": 
     [ 
      {"Name":"Diamond"}, 
      {"Name":"Loose"} 
     ], 
    } 
]} 

私が達成しようとしているどのような効果的である:

GreyXXSDiamond 
GreyXSDiamond 
GreySDiamond 
... 
GreyXXSLoose 
GreyXSLoose 
... 
BlueXXSDiamond 
BlueXSDiamond 
... 

私はSOに見つかったカップル再帰関数を試してみましたが、無駄にしました。

 if (product.AttributeSet.AttributeGroups.length > 0) { 

     var groupIndex = 0; 
     for (var g = 0; g < product.AttributeSet.AttributeGroups.length; g++) { 
      var group = product.AttributeSet.AttributeGroups[g]; 

      for (var a = 0; a < group.Attributes.length; a++) { 
       var attribute = group.Attributes[a]; 

       var x = 0; 

       var otherAtts = ''; 
       for (var g2 = 0; g2 < product.AttributeSet.AttributeGroups.length; g2++) { 
        if (g2 > groupIndex) { 

         var group2 = product.AttributeSet.AttributeGroups[g2]; 

         for (var a2 = 0; a2 < group2.Attributes.length; a2++) { 
          var attribute2 = group2.Attributes[a2]; 
          otherAtts += attribute2.Name; 
         } 
        } 
       } 
       console.log(attribute.Name + otherAtts); 

      } 
      break; 
     } 
    } 

もちろん上記は動作しません:

私は jQueryの javascriptのですが失敗しました。誰でも再帰的なソリューションを実装する方法についての洞察を提供できますか?

あなたが前のステップからの結果に、すべての属性グループのコンテンツを追加することによって、反復的にこれを行うことができます
+0

ループを使用せず、再帰関数を使用します – Shaheer

+0

*「失敗したjQueryは...」*これはいいえjQuery。 jQueryはJavaScriptと同義ではありません。 jQueryは、JavaScriptで書かれた単なるコードライブラリです。 –

+0

これは再帰を必要としません。 *ハックに頭を下げる* – millimoose

答えて

2

// go over the previous results, and append the contents of the group to each 
function appendAttributes(attributes, accum) { 
    var result = []; 
    $.each(accum, function(_, it) { 
     $.each(attributes, function(_, attr) { 
      result.push(it+attr.Name); 
     }); 
    }); 
    return result; 
} 

var result = [""] // starter value 
$.each(data.AttributeGroups, function(_, group) { 
    result = appendAttributes(group.Attributes, result); 
}); 

console.log(result); 

jsFiddleデモ:http://jsfiddle.net/inerdial/FdFcB/1/(結果ですconsole.log GED)Inerdialのコード@

+0

素晴らしい作品です - ありがとう! –

1

result = obj["AttributeGroups"].reduce(function(r, item) { 
    return item.Attributes.reduce(function(ary, att) { 
     return ary.concat(r.map(function(s) { return s + att.Name })) 
    }, []); 
}, [""]) 
関連する問題