使用javascript排序函数基于条件排序数组
我想根据数字对javascript数组进行排序,但我希望一个特定的组(例如推荐组)先出现,然后升序,然后是其他没有类型的组 下面是div,我想以这样一种方式进行排序:推荐的div排在第一位,按升序排列,然后按升序排列其他div 下面的代码按升序正确排序没有数据类型的div,但推荐的未按预期的升序排序使用javascript排序函数基于条件排序数组,javascript,jquery,sorting,Javascript,Jquery,Sorting,我想根据数字对javascript数组进行排序,但我希望一个特定的组(例如推荐组)先出现,然后升序,然后是其他没有类型的组 下面是div,我想以这样一种方式进行排序:推荐的div排在第一位,按升序排列,然后按升序排列其他div 下面的代码按升序正确排序没有数据类型的div,但推荐的未按预期的升序排序 var sortedDivs = $(".terminalpopular").toArray().sort(sorter); console.log(sortedDivs); function
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如果您想将推荐类型和特色类型交错,并使它们都具有粘性,那么您应该采用类似的方法。仅使用排序函数是不合理的;如果可能的话。按数量对项目进行排序,然后按类型(推荐、特色、剩余)进行分组。现在您应该已经对组进行了排序。将推荐的阵列和特色阵列交错,然后将其余阵列合并到该阵列。