使用javascript排序函数基于条件排序数组

使用javascript排序函数基于条件排序数组,javascript,jquery,sorting,Javascript,Jquery,Sorting,我想根据数字对javascript数组进行排序,但我希望一个特定的组(例如推荐组)先出现,然后升序,然后是其他没有类型的组 下面是div,我想以这样一种方式进行排序:推荐的div排在第一位,按升序排列,然后按升序排列其他div 下面的代码按升序正确排序没有数据类型的div,但推荐的未按预期的升序排序 var sortedDivs = $(".terminalpopular").toArray().sort(sorter); console.log(sortedDivs); function

我想根据数字对javascript数组进行排序,但我希望一个特定的组(例如推荐组)先出现,然后升序,然后是其他没有类型的组

下面是div,我想以这样一种方式进行排序:推荐的div排在第一位,按升序排列,然后按升序排列其他div

下面的代码按升序正确排序没有数据类型的div,但推荐的未按预期的升序排序

var sortedDivs = $(".terminalpopular").toArray().sort(sorter);
console.log(sortedDivs); 

function sorter(a, b) {
    if(a.getAttribute('data-type') == 'Recommended'){
        if (parseFloat(a.getAttribute('data-amount')) < parseFloat(b.getAttribute('data-amount'))){
          return -1;
        }
        return 0;
    }
    else{
      if (parseFloat(a.getAttribute('data-amount')) > parseFloat(b.getAttribute('data-amount'))){
        return 1;
      }
      return 0;
    }
  }
var sortedDivs=$(“.terminalpopular”).toArray().sort(分拣机);
控制台日志(分拣的DDIV);
功能分拣机(a、b){
if(a.getAttribute('data-type')=='Recommended'){
if(parseFloat(a.getAttribute('data-amount'))parseFloat(b.getAttribute('data-amount')){
返回1;
}
返回0;
}
}
上述代码以如下形式对div进行排序:

<div class="hotel-list listing-style3 hotel" id="list_view_listingpopular">
    <div class="terminalpopular" data-amount="65.95" data-type="Recommended">
    </div>
    <div class="terminalpopular" data-amount="94.95" data-type="Recommended">  </div>
    <div class="terminalpopular" data-amount="70" data-type="Recommended">
    </div>
    <div class="terminalpopular" data-amount="54.95" data-type="">
    </div>
    <div class="terminalpopular" data-amount="67.99" data-type="">
    </div>
    <div class="terminalpopular" data-amount="75" data-type="">
    </div>
    <div class="terminalpopular" data-amount="78" data-type="">
    </div>
    <div class="terminalpopular" data-amount="84.99" data-type="">
    </div>
    <div class="terminalpopular" data-amount="84.99" data-type="">
    </div>
    </div>

如上所述,可以看出,没有任何数据类型的div被正确排序,但是推荐的div没有按预期的升序排序

var sortedDivs = $(".terminalpopular").toArray().sort(sorter);
console.log(sortedDivs); 

function sorter(a, b) {
    if(a.getAttribute('data-type') == 'Recommended'){
        if (parseFloat(a.getAttribute('data-amount')) < parseFloat(b.getAttribute('data-amount'))){
          return -1;
        }
        return 0;
    }
    else{
      if (parseFloat(a.getAttribute('data-amount')) > parseFloat(b.getAttribute('data-amount'))){
        return 1;
      }
      return 0;
    }
  }
注意:它确实出现在IF子句和条件确实满足的情况下,即
(IF(a.getAttribute('data-type')=='Recommended'){})
。我把控制台放在IF中,它会比较值


请帮忙。谢谢

只有当两者相等时,才必须返回0

在比较“金额”属性的两个位置使用此选项:

return parseFloat(a.getAttribute('data-amount')) - parseFloat(b.getAttribute('data-amount'))

由于JS中的类型强制,您可以使用布尔值(就像在比较中)作为数字。弦也是一样。由于
-
是一个数字操作,字符串也将被转换为数字

因此,您可以将其视为两个“属性”上的简单数字排序

功能分拣机(a、b){
return(b.dataset.type===“推荐”)-(a.dataset.type===“推荐”)
||a.dataset.amount-b.dataset.amount;
}
var sortedDivs=$(“.terminalpopular”).toArray().sort(分拣机);
console.log(sortedDivs)
.as控制台包装{top:0;最大高度:100%!important}

如果一种类型的元素要先在它们之间排序,那么您可能应该在一个数组中将它们分开并在那里排序,稍后将它们与其他排序的元素合并

试试这个:

 var sortedDivs1 = $(".terminalpopular").toArray().filter(function(){
               return $(this).attr('data-type') == 'Recommended'
            }).sort(sorter);
 var sortedDivs2 = $(".terminalpopular").toArray().filter(function(){
               return $(this).attr('data-type') != 'Recommended'
            }).sort(sorter);
var sortedDivs = $.merge(sortedDivs1, sortedDivs2);
console.log(sortedDivs); 

function sorter(a, b) {

        return parseFloat(a.getAttribute('data-amount')) - 
               parseFloat(b.getAttribute('data-amount'));
 }

我不知道是否可以用一种方法来完成,但是有两种方法,这对我来说很有效

var myList = $(".terminalpopular");

myList.sort(function(a, b){
    return $(a).data("amount")-$(b).data("amount");
}).sort(function(a, b){
    if ($(a).data("type") == "Recommended" && !$(b).data("type"))
        return -1;
    else if (!$(a).data("type") && $(b).data("type") == "Recommended")
        return 1;
    else
        return 0;
});

$("#list_view_listingpopular").html(myList);
给你一把小提琴


我希望有帮助。

您可以使用一个简单的逻辑:

  • 创建4个标志,建议为元素创建2个标志,为金额值创建2个标志
  • 由于“推荐”的优先级高于“金额”,所以它应该排在第一位
  • 如果两者都推荐,请检查金额
函数排序列表(){
变量列表=$('.terminalpopular');
var clone=list.clone();
var recommended='recommended'
clone.sort(函数(a,b){
var IsaRecommendated=$(a)。数据('type')==建议值?-10:0;
var isBRecommended=$(b).数据('type')==建议值?-10:0;
var amountA=数字($(a).数据('金额');
var amountB=数字($(b).数据('金额');
返回ISA建议-ISB建议| | amountA-amountB;
});
list.parent().empty().append(克隆)
}
//这仅用于显示目的
函数displayValue(){
$('.terminalpopular')。每个(函数(i,el){
$(el).text($(el).data('金额');
if($(el).data('type')){
$(el).addClass('突出显示')
}
})
}
displayValue();
sortList()
.terminalpopular{
高度:30px;
边框:1px纯色灰色;
}
.亮点{
背景:ddd;
}


仅当它们相等时返回0。在返回0的两个位置,不确定两者是否相等,请添加另一个检查。如果您可以共享HTML而不仅仅是快照,则会有所帮助。谢谢。你太棒了。我从你的回答中得到了这个想法,并将其推广到其他类型,并且像一个魔术师一样工作。谢谢,伙计,我有最新消息。您能建议我如何以这种方式根据类型对数组进行排序吗。i、 e.推荐值为84、74、64,我们还提供了特征类型,值为78、68、88。我们可以按以下形式对其进行排序:64(推荐)、68(特色)、74(推荐)、78(特色)、84(推荐)、88(特色)等@Owais如果您想将推荐类型和特色类型交错,并使它们都具有粘性,那么您应该采用类似的方法。仅使用排序函数是不合理的;如果可能的话。按数量对项目进行排序,然后按类型(推荐、特色、剩余)进行分组。现在您应该已经对组进行了排序。将推荐的阵列和特色阵列交错,然后将其余阵列合并到该阵列。