2014-11-21 59 views
1

我的目標是根據它們位置的數據集對頁面上的元素進行分組。內容已經被渲染到頁面上,並且我要爲位於該處的事件上方的每個唯一位置使用位置標題。頁面的結構將是類名>位置>類時間jquery .each()梳理每次運行的所有值

我正在做幾個.each()循環來試圖找到我需要的,但我認爲應該是單獨運行的值首先每個循環都被組合在一起。事情是,每個循環仍然運行多次。

$('.class-Info').each(function() 
{ 
    var className = $("h2").text(); 
    var eventLocations = []; 
    $('.scheduledClass').each(function (index) 
    { 
     eventLocations[index] = $(this).data("location"); 
    }); 

    var key = ""; 
    var uniqueLocations = []; 
    $(eventLocations).each(function (index, location) 
    { 
     if (key !== eventLocations[index]) 
     { 
      key = eventLocations[index]; 
      uniqueLocations.push(eventLocations[index]); 
     } 
    }); 

    console.log ("For " + className + " the locations are " + uniqueLocations); 

}); 

這是我的代碼。我希望我的問題有道理。看看控制檯,看看我收到的結果。

http://jsfiddle.net/qnpr9fbh/5/

+0

剛做了一個小小的編輯,我意識到在'.scheduledClass'元素的每個循環中都沒有得到正確的'className'。必須添加相同的'$(this).find('h2')' – 2014-11-21 02:03:37

回答

0

我想我明白你想在這裏買到。

http://jsfiddle.net/qnpr9fbh/7/

如果你更新你的第一個每個循環像這樣(添加$(this).find),它會尋找存在於當前.class-Info.scheduledClass元素。之前,它只是尋找所有這些。這導致了不同的,看似合適的控制檯輸出。

$(this).find('.scheduledClass').each(function (index) { 
    eventLocations[index] = $(this).data("location"); 
}); 

// Edit: Also make sure you select the correct "h2" by adding the $(this).find() 
var className = $(this).find("h2").text(); 

控制檯輸出:

有關的DocuSign管理員帳戶物流TrainingCreating的DocuSign 數字工作流程:模板的位置是地點待定

創建的DocuSign數字工作流程:模板的位置是 測試1,威利斯大廈,地理位置待定

就是你想要的東西嗎?


jQuery有一些方便的功能,可以使你的代碼也有點小,乾淨,太:

$('.class-Info').each(function() { 
    var className = $(this).find("h2").text(), 
     eventLocations = $.map($(this).find('.scheduledClass'), function (elem) { 
      return $(elem).data("location"); 
     }), 
     uniqueLocations = $.unique(eventLocations.slice()); 

    console.log ("For " + className + " the locations are " + uniqueLocations); 
}); 
  • .map() - 在選定的元素將循環,並創建數組出來的從函數返回的項目。
  • .unique() - 將減少jQuery元素的數組或列表,並將其減少爲只包含唯一值的數組。
  • Javascript Array.slice() - 我在eventLocations數組上調用它,因爲.slice()將克隆該數組。必要的,因爲.unique()將修改它收到的數組。所以就給它一個副本,並且原件不會被修改。
+0

感謝您的額外功能!我以前從未見過地圖或獨特的地圖,但我認識到切片,但忘記了它。 – 2014-11-21 05:47:42

+1

澄清有關我的代碼版本的解決方案。僅僅因爲每個()的迭代都在查看一個元素並不意味着下一個jquery選擇器只能看到該塊內部?定義$(this)是將jquery限制爲第一個元素內的代碼的部分? – 2014-11-21 05:54:17

+0

是的,沒錯。當你做一個像$('。class')這樣的選擇器時,它會查看'.class'元素的HTML的所有內容,但是你可以通過先選擇父元素然後調用'.find()'就像我一樣。 – 2014-11-21 07:08:41