javascript - 通过属性对数组内的数组重新排序的最佳方法

标签 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'
   '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/

相关文章:

javascript - 是否可以在 php 验证和重定向之后调用 html 中的 js?现在尝试用Ajax解决

javascript - 使用 TLS 时的 WebSocket 错误(但并非没有)

javascript - d3 树数所有 child

Java大列表入口耦合的方法

php - 无需使用 javascript 将 POST 页面加载到 &lt;iframe&gt;

javascript - 用于 Web 和移动设备的 Flash 与 HTML5 游戏开发

c++ - 将 3D numpy 数组从 cython 传递到 C++

ios - 如何将 Swift.ArraySlice 转换为 Swift.Array?

c# - 使用 List.Sort(Comparison<T> comparison) 在 C# 中对列表进行排序

java - 按值对 HashMap 进行排序