2010-08-24 23 views
0

我有我的網頁上的這個簡化版本(其一團糟IRL):jQuery:我如何構建一個2d數組?

<li id=section1 class=sortable_section> 
    <header> 
    <ul id=container1> 
     <li id=item1 class=sortable_item> 
     <li id=item2 class=sortable_item> 
    </container 
</section 

<li id=section2 class=sortable_section> 
    <header> 
    <ul id=container2> 
     <li id=item3 class=sortable_item> 
     <li id=item4 class=sortable_item> 
     <li id=item5 class=sortable_item> 
    </container> 
</section> 

所以,我能做的$j("container1").sortable('serialize')它創建的所有含Li的的ID數組。所以我會得到["item1", "item2"]container1

如何使一個數組,看起來像這樣:

[ 
["section1", ["item1", "item2"]], 
["section2", ["item3", "item4", "item5"]] 
] 

這是香港專業教育學院一直在努力:但它不工作

 d = $j.makeArray(
     $j('.sortable_section').each(function(i){ 
      [$j(this).attr("id"), 
       $j.makeArray($j.map($j("#"+$j(this).attr("id")+" .sortable_item"), function(s,j){ 
        return ($j(s).attr("id")); 
       }))] 
     })); 

但它返回整個對象,而不只是ID ...

編輯: 根據答案的建議之一,這是現在我有什麼

d = $j(".sections > li").map(function(index, element){ 
       return [$j(element).attr('id'), 
        $j("#"+$j(element).attr('id') + " .content").map(function(subindex, subelement){ 
         return $j(subelement).attr('id'); 
        }).toArray()]; 


      }).toArray(); 

,但我得到這個錯誤

TypeError: Result of expression near '...}).toArray()]...' [undefined] is not a function. 

當我做$j(element).attr('id')$j(subelement).attr('id')提醒我得到正確的ID

回答

1

使用jQuery的map功能:

$('#master-list > li').map(function(index, element) 
{ 
    return [$(element).attr('id'), 
     $(this).children('ul > li').map(function(subindex, subelement) 
     { 
      return $(subelement).attr('id'); 
     }).toArray()]; 
}).toArray(); 

編輯:

我的不好。以上已更新爲適當的.toArray()調用。

重新編輯:

好的,這就是我得到的自由式編碼。這是正確的,實際測試過的腳本,以及我用來測試它的標記。我無法再現您的錯誤,但可能是由於沒有id的元素或者可能與將$符號重命名爲$j有關。

<script type="text/javascript"> 
    $(function() { 
     var x = $('#master-list > li').map(function (index, element) { 
      return [[element.id, 
       $(element).find('li').map(function (subindex, subelement) { 
        return subelement.id; 
       }).toArray()]]; 
     }).toArray(); 
    }); 
</script> 

<ul id="master-list"> 
    <li id="section1" class="sortable_section"> 
     Header 
     <ul id="container1"> 
      <li id="item1" class="sortable_item">a</li> 
      <li id="item2" class="sortable_item">b</li> 
     </ul> 
    </li> 

    <li id="section2" class="sortable_section"> 
     Header 
     <ul id="container2"> 
      <li id="item3" class="sortable_item">a</li> 
      <li id="item4" class="sortable_item">b</li> 
      <li id="item5" class="sortable_item">c</li> 
     </ul> 
    </li> 
</ul> 

原因上面沒有工作是關於jQuery的map的作用有點怪異:顯然,如果返回值的數組,它展平了數組,並返回所有的值。所以,而不是[a, [b, c]]你只是得到[a, b, c]。爲了解決這個問題,我添加了一組額外的括號,這樣你現在可以返回一個包含數組的數組,當它變平時,就是你想要的。

僅供參考,您不必這樣做:

$('#' + $(element).attr('id') + ' .content') 

你可以得到更可讀的代碼與此相同的效果:

$(element).find('.content'); 
+0

當我提醒這段代碼時,它告訴我我的數組是[object Object],而不是我的問題中所需的數組。 – NullVoxPopuli 2010-08-24 20:32:55

+0

我編輯了答案。 (忘了jQuery map函數返回一個jQuery集合) – 2010-08-24 21:04:56

+0

我得到這個錯誤TypeError:'...})附近的表達式結果toArray()...'[undefined]不是一個函數。 – NullVoxPopuli 2010-08-25 13:00:34

0

你能使用

var serializedListItems = $("li").serializeArray(); 
+0

沒有,原因有n個部分,每個部分有自己的ul項目。 – NullVoxPopuli 2010-08-24 19:48:33