2013-03-21 134 views
3

我試圖按價格和評分對結果列表進行排序。爲了簡單起見,我剛剛收錄了2個結果:Rider's Lodge和Olina Lodge。我寫了一個可以單向排序的函數。jQuery按升序和降序排序(不是表格)

如何重新使用相同的函數對我的結果進行排序,以便點擊'按價格排序'按升序排序,再次點擊它按降序排序並在兩者之間切換?

<div class="tab-content"> 
    <div id="filters"> 
     <p> 
      <a href="javascript:sort_by_rating();">Sort by Rating</a> 
      <br> 
      <a href="javascript:sort_by_price();">Sort by Price</a> 
     </p> 
    </div> 


    <div id="div_hotel_results" class="tab-pane active"> 
     <form id="hotel-form"> 
     ... 
     </form> 
     <div class="results-row"> 
      <h5>Riders Lodge</h5> 
      <span class="label label-info price">$103.64</span> 
      <span class="rating" data-rating="3.0">3.0</span> 
     </div> 

     <div class="results-row"> 
      <h5>Olina Lodge</h5> 
      <span class="label label-info price">$99.64</span> 
      <span class="rating" data-rating="2.5">2.5</span> 
     </div> 
    </div> 
</div> 

<script type="text/javascript"> 
function sort_by_price() { 
    var sorted_list = []; 
    $('.price').each(function (index) { 
     sorted_list[index] = $(this).parent().parent().remove(); 
     sorted_list[index]['cleaned_price'] = parseFloat($(this).text().replace(/[^0-9\.]+/g,"")); 
    }); 

    sorted_list.sort(function (a, b) { 
     if (a['cleaned_price'] == b['cleaned_price']) { 
      return 0; 
     } else if (a['cleaned_price'] > b['cleaned_price']) { 
      return 1; 
     } else { 
      return -1; 
     } 
    }); 

    $('#hotel-form').after(sorted_list); 
} 
</script> 
+0

你想要的功能評價/價格之間既升序排序,desceding和開關? – 2013-03-24 15:34:51

回答

6

下面是一個例子。我相信你只想要價格,而不是評級。我創建了一個變量,幫助跟蹤排序的當前狀態。然後根據它升序/降序排序。

我也將您的事件綁定移到html之外。

Working Demo

HTML:

<div class="tab-content"> 
    <div id="filters"> 
     <p> 
      <a class="sortByRating" href="#" >Sort by Rating</a> 
      <br> 
      <a class="sortByPrice" href="#">Sort by Price</a> 
     </p> 
    </div> 


    <div id="div_hotel_results" class="tab-pane active"> 
     <form id="hotel-form"> 
     ... 
     </form> 
     <div class="results"> 
      <div class="results-row"> 
       <h5>Riders Lodge</h5> 
       <span class="label label-info price">$103.64</span> 
       <span class="rating" data-rating="3.0">3.0</span> 
      </div> 

      <div class="results-row"> 
       <h5>Olina Lodge</h5> 
       <span class="label label-info price">$99.64</span> 
       <span class="rating" data-rating="2.5">2.5</span> 
      </div> 
     </div> 
    </div> 
</div> 

的Javascript:

var ascending = false; 

$('.tab-content').on('click','.sortByPrice',function(){ 

    var sorted = $('.results-row').sort(function(a,b){ 
     return (ascending == 
       (convertToNumber($(a).find('.price').html()) < 
       convertToNumber($(b).find('.price').html()))) ? 1 : -1; 
    }); 
    ascending = ascending ? false : true; 

    $('.results').html(sorted); 
}); 

var convertToNumber = function(value){ 
    return parseFloat(value.replace('$','')); 
} 
+0

按分級排序不起作用。 – 2013-03-24 15:22:35

+0

據我可以告訴他,他不要求評級之一。他希望能夠在價格上升和下降之間切換。 「點擊'按價格排序'按升序排列,再次點擊按降序排列,並在兩者之間切換?」。我認爲我們需要作者澄清這一點。 – 2013-03-24 15:30:02

+0

我認爲它清楚地寫在第一行**我試圖根據價格和評級對結果列表進行排序** – 2013-03-24 15:32:27

0
//package algorithm.sort; 

public class QuickSort 
{ 

    public static void main(String[] args) { 
     int[] x = { 9, 2, 4, 7, 3, 7, 10 }; 
     printArray(x); 

     int low = 0; 
     int high = x.length - 1; 

     quickSort(x, low, high); 
     printArray(x); 
    } 

    public static void quickSort(int[] arr, int low, int high) { 

     if (arr == null || arr.length == 0) 
      return; 

     if (low >= high) 
      return; 

     //pick the pivot 
     int middle = low + (high - low)/2; 
     int pivot = arr[middle]; 

     //make left < pivot and right > pivot 
     int i = low, j = high; 
     while (i <= j) { 
      while (arr[i] < pivot) { 
       i++; 
      } 

      while (arr[j] > pivot) { 
       j--; 
      } 

      if (i <= j) { 
       int temp = arr[i]; 
       arr[i] = arr[j]; 
       arr[j] = temp; 
       i++; 
       j--; 
      } 
     } 

     //recursively sort two sub parts 
     if (low < j) 
      quickSort(arr, low, j); 

     if (high > i) 
      quickSort(arr, i, high); 
    } 

    public static void printArray(int[] x) { 
     for (int a : x) 
      System.out.print(a + " "); 
     System.out.println(); 
    } 
}