[英]Javascript sorting array twice (different sort methods)
我有一个数组,该数组在页面加载时根据需要对数组进行排序,具体取决于当前日期,它显示具有未来日期的对象,然后显示具有过去日期的对象,我们称其为dateToPlay。
我有两个单选按钮,可调用该方法对同一数组进行排序,并且在页面加载时,它对数组的排序方式与我上面提到的完全一样。 问题是当我使用其他排序方法createdAt对数组进行排序时,该方法仅按创建日期对数组进行排序。 此方法可以对它进行很好的排序,但是当我按另一个收音机按datesToPlay进行排序时,它不会对数组进行排序。
function SortByPlayTime(a, b){
var currentDate = new Date();
if(lastDateOfObjectsInArray > currentDate){
if(a.attributes.start >= currentDate){
if(a.attributes.start > b.attributes.start && b.attributes.start >= currentDate)
return 1;
else
return -1;
} else if(b.attributes.start >= currentDate){
if(b.attributes.start > a.attributes.start)
return -1;
else
return 1;
}
else{
if(a.attributes.start > b.attributes.start)
return 1;
else
return -1;
}
} else{
if(a.attributes.start > b.attributes.start)
return -1;
else
return 1;
}
function SortByCreation(a, b){
if(a.attributes.createdAt > b.attributes.createdAt)
return 1;
else
return -1;
基本上,我正在做的是我有一个数组,其中所有对象都是im试图排序的,该数组的大小各不相同,可以像1000个或更多对象。
在函数loadArrayToShowFilters()中,我要做的是准备一个将在表中显示的新数组(有关屏幕,请参见上面的注释)。 这是因为我模仿一个表,但实际上我在做数组的所有工作。 此数组的长度始终为100或更短。
function loadArrayToShowFilters() {
//array = the array of objects Im trying to filter
var sizeArrayToShow;
if(array.length < 100)
sizeArrayToShow = array.length;
else
sizeArrayToShow = 100;
arrayTableToShow = [];
//arrayTableToShow = This is the array that holds the objects that are shown on the table
for (var i = 0; i < sizeArrayToShow; i++) {
arrayTableToShow[i] = array[i];
};
触发排序的事件:事件单击两个单选按钮。
执行实际排序的代码:在单击每个单选按钮的事件上,我分别执行array.sort(SortByCreation)等操作。
样本数据:{“开始”:{“ __ type”:“日期”,“ iso”:“ 2018-02-01T11:00:00.000Z”},“结束”:{“ __ type”:“日期”,“ iso “:” 2018-02-01T12:00:00.000Z“},” createdAt“:” 2018-01-29T20:37:51.477Z“,” updatedAt“:” 2018-02-23T03:12:15.968Z“, “ objectId”:“ dSVZXFAIyf”}
它基本上只是一个带有对象的数组,每个具有可变属性的对象都具有变量start和createdAt,这些变量用于进行排序
大事记:
'click #lastCreated'(event){
orderArregloCreatedAt();
},
'click #nextToPlay'(event){
orderArregloPlayTime();
}
function orderArregloCreatedAt() {
array.sort(SortByCreation);
loadArrayToShowFilters();
}
function orderArregloPlayTime() {
array.sort(SortByPlayTime);
loadArrayToShowFilters();
}
解决此问题所需的信息仍然十分匮乏。 但是我认为故障在于SortByPlayTime
的排序算法。
这有点疯狂,但是请您告诉我以下更改是否可以实现:
代码更改:
function SortByPlayTime(a, b) {
var currentDate = new Date();
// a is future, b is past, so a shows above b = -1
if (a.attributes.start >= currentDate && b.attributes.start < currentDate) return -1;
// a is past, b is future, so a shows below b = 1
if (a.attributes.start < currentDate && b.attributes.start >= currentDate) return 1;
// both a and b are similarly future or past so compare on their values alone, in ascending order
// if a > b then it should show below b, = positive result
return a.attributes.start - b.attributes.start;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.