2013-03-21 108 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(); 
    } 
}