Javascript 通过属性对数组中的数组重新排序的最佳方法

Javascript 通过属性对数组中的数组重新排序的最佳方法,javascript,arrays,sorting,Javascript,Arrays,Sorting,假设我有以下数组 [{ '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'

假设我有以下数组

[{
   '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'
 }
]
后端按创建的日期检索。如果订单>0,我只想在创建的同一日期重新排序。因此,如果日期相等且存在顺序,则对数组的该部分进行排序

我目前的尝试如下:

   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;
    }
函数排序(数组){
var newarray=[];
var-sortarray=[];
对于(vari=0;i0)sortarray.push(数组[i]);
否则{
sortarray.push(数组[i]);
sortarray.sort(函数(a,b){
返回a.订单>b.订单;
});
newarray=newarray.concat(sortarray);
}
}
}
返回新数组;
}

我觉得这可以做得更好。我的第一篇文章在这里,所以我可能已经错过了我应该如何做到这一点,请让我知道,如果它需要纠正。提前感谢。

将数据声明修复为合法Javascript后,您可以对内置的
数组.sort()使用自定义回调。
。自定义回调按两个键进行排序,首先按
date\u 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数据=[{
“id”:1,
“顺序”:0,
“姓名”:“约翰”,
“创建日期”:“2015-12-8”
},
{
“id”:1,
“顺序”:3,
'姓名':'山姆',
“创建日期”:“2015-12-11”
},
{
“id”:1,
“顺序”:1,
“姓名”:“艾伦”,
“创建日期”:“2015-12-11”
},
{
“id”:1,
“顺序”:2,
“名字”:“米克”,
“创建日期”:“2015-12-11”
},
{
“id”:1,
“顺序”:0,
“姓名”:“弗雷德”,
“创建日期”:“2015-12-11”
},
{
“id”:1,
“顺序”:0,
“姓名”:“莎拉”,
“创建日期”:“2015-12-14”
}
]
数据排序(函数(a,b){
var dateA=Date.parse(a.Date\u创建);
var dateB=Date.parse(b.Date\u创建);
如果(dateA!==dateB){
返回日期a-日期b;
}否则{
//如果日期相等,则按顺序排序
退货+a.订单-+b.订单;
}
});
日志(数据);
函数日志(x){
var div=document.createElement(“div”);
div.innerHTML=JSON.stringify(x);
文件.正文.附件(div);

}
建议使用而不是自己发明。如果可能的话,让后端按日期创建订单,这样您就不必编写任何代码了。@Chris,问题是我只需要在创建日期的同一天进行排序。我不确定内置数组排序如何帮助实现这一点。@Kenney我尝试了按日期排序,在Laravels Elount ORM中排序,但没有任何区别。@user5514813-下面jfriend00的答案准确地捕捉到了我想要指的内容,但没有足够的时间详细说明。很高兴你得到了答案!太棒了,太完美了。工作很愉快。不知道为什么,但如果日期相等,按顺序排序返回+a.order-+b.order;}对我来说没有多大意义。@user5514813-额外的
+
符号在
+a.order-+b.order
只允许
order
属性为字符串,
+
将其转换为数字。如果您知道属性始终是一个实际数字,则可以删除这两个
+
符号。出于某种原因,当我编写代码时,我认为它们是字符串,而不是数字,所以需要进行转换,但似乎不需要。Thx@jfriend00-这正是我在评论中所想的,但我太专注于工作而无法详细阐述。我曾希望有人能以此为基础: