2012-02-04 46 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,但無濟於事。

我的失敗的jQuery JavaScript是:

 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; 
     } 
    } 

顯然上述不起作用。任何人都可以提供有關如何實現遞歸解決方案的任何見解?

+0

不使用循環中,使用遞歸函數 – Shaheer 2012-02-04 22:44:56

+0

*「我失敗了jQuery是......」 *這是沒有t jQuery。 jQuery不是JavaScript的同義詞。 jQuery只是一個用JavaScript編寫的代碼庫。 – 2012-02-04 22:57:53

+0

這不需要遞歸。 *頭向黑客* – millimoose 2012-02-04 23:04:27

回答

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)

+0

工程偉大 - 讚賞! – 2012-02-05 00:24:45

1

@ Inerdial的代碼好,這裏是另一種功能的方法:

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 })) 
    }, []); 
}, [""])