假设我有以下数组
[{
'id'=>1
'order'=>0
'name'=>'john'
'date_created'=>'2015-12-8'
},
{
'id'=>1
'order'=>3
'name'=>'sam'
'date_created'=>'2015-12-11'
},
{
'id'=>1
'order'=>1
'name'=>'allen'
'date_created'=>'2015-12-11'
},
{
'id'=>1
'order'=>2
'name'=>'mick'
'date_created'=>'2015-12-11'
},
{
'id'=>1
'order'=>0
'name'=>'fred'
'date_created'=>'2015-12-11'
},
{
'id'=>1
'order'=>0
'name'=>'sarah'
'date_created'=>'2015-12-14'
}
]
后端按创建日期检索。如果 order > 0 仅在同一 date_created 上,我想重新排序。因此,如果日期相等并且存在顺序,则对数组的该部分进行排序。
我当前的尝试如下:
function sortArray(array) {
var newarray = [];
var sortarray = [];
for(var i=0;i<array.length;i++) {
if(!array[i].order) newarray.push(array[i]);
else {
if(i+1 !== array.length && array[i].date === array[i+1].date && array[i+1].order > 0) sortarray.push(array[i]);
else {
sortarray.push(array[i]);
sortarray.sort(function(a, b) {
return a.order>b.order;
});
newarray = newarray.concat(sortarray);
}
}
}
return newarray;
}
我觉得这可以做得更好。我在这里发表的第一篇文章,所以我可能错过了我应该如何做到这一点,如果需要更正,请告诉我。提前致谢。
最佳答案
将数据声明修复为合法的 Javascript 后,您可以对内置 array.sort()
使用自定义回调。自定义回调按两个键排序,首先按 date_created
排序,然后如果它们相等,则按顺序排序。
data.sort(function(a, b) {
var dateA = Date.parse(a.date_created);
var dateB = Date.parse(b.date_created);
if (dateA !== dateB) {
return dateA - dateB;
} else {
// if dates are equal, sort by order
return +a.order - +b.order;
}
});
并且,您可以实际运行的工作片段:
var data = [{
'id':1,
'order':0,
'name':'john',
'date_created':'2015-12-8'
},
{
'id':1,
'order':3,
'name':'sam',
'date_created':'2015-12-11'
},
{
'id':1,
'order':1,
'name':'allen',
'date_created':'2015-12-11'
},
{
'id':1,
'order':2,
'name':'mick',
'date_created':'2015-12-11'
},
{
'id':1,
'order':0,
'name':'fred',
'date_created':'2015-12-11'
},
{
'id':1,
'order':0,
'name':'sarah',
'date_created':'2015-12-14'
}
]
data.sort(function(a, b) {
var dateA = Date.parse(a.date_created);
var dateB = Date.parse(b.date_created);
if (dateA !== dateB) {
return dateA - dateB;
} else {
// if dates are equal, sort by order
return +a.order - +b.order;
}
});
log(data);
function log(x) {
var div = document.createElement("div");
div.innerHTML = JSON.stringify(x);
document.body.appendChild(div);
}
如果您实际上并不希望主要排序为date_created
,而是希望它们保持当前顺序(无论它是什么),那么也可以这样做(我不太明白)从你的问题中可以肯定你想要的)。
关于javascript - 通过属性对数组内的数组重新排序的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34233892/