Javascript和更高级的排序

The*_*rby 1 javascript arrays sorting

我知道这个网站周围有很多这样的问题,但是我很挣扎,在尝试之前我曾尝试过做作业.

我有一个对象数组,每个对象有三个字段.状态,类型和时间.都是整数.

  • 状态介于1-9之间,表示可用性,所有内容均按状态排序.

  • 如果用户为0,则表示类型 - "付费"或1 - "免费".付费总是高于免费.

这是我的代码

  function sortListings(obj1, obj2) {
        var statusA = obj1.status;
        var statusB = obj2.status;

        var typeA = obj1.type;
        var typeB = obj2.type;

        if (typeA == typeB) {
                return (statusA < statusB) ? -1 : (statusA > statusB) ? 1 : 0;
        } else {
            return (typeA < typeB ) ? -1 : 1;
        }
    }
Run Code Online (Sandbox Code Playgroud)

这很有效.现在有时两个对象将具有相同的状态并且处于相同的付费类型.所以我想在这种情况下首先提供最新的时间戳.

  • 时间存储为int(unix)

我不知道怎么回事.这是我的尝试:

  function sortListing(obj1, obj2) {
        var statusA = obj1.status;
        var statusB = obj2.status;

        var typeA = obj1.type;
        var typeB = obj2.type;

        var timeA = obj1.time;
        var timeB = obj2.time;

        if (typeA == typeB) { // has the same type
            if (statusA == statusB) { // has the same status
                return timeA - timeB; //so sort by time
            } else { // different statues, same type
                return (statusA < statusB) ? -1 : (statusA > statusB) ? 1 : 0; // sort by status
            }
        } else {
            return (typeA < typeB ) ? -1 : 1;
        }
    }
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,我对排序内部运作的了解并不是那么好.非常感谢任何文章,答案或评论.

Aln*_*tak 5

如果较高级别的字段相同,则主要问题是不太重要的字段.试试这个:

function sortListing(obj1, obj2) {

    function compareType(a, b) {
        return a.type - b.type;
    }

    function compareStatus(a, b) {
        return a.status - b.status;
    }

    function compareTime(a, b) {
        return a.time - b.time;
    }

    return compareType(obj1, obj2) ||
           compareStatus(obj1, obj2) ||
          -compareTime(obj1, obj2);      // negative to reverse order
}
Run Code Online (Sandbox Code Playgroud)

||短路操作者将导致仅当现有的比较返回0的排序顺序是平凡通过改变其中三个功能被调用的顺序只是改变了第二(随后第三)相比进行评估.

当然,内部函数可以在更高级别的范围内公开,允许您单独使用每个比较器函数,或者以交替顺序使用.

另请注意,除非绝对必要,否则此方法如何避免取消引用任何对象属性.如果你正在排序数千个可以产生重大影响的条目,尽管在实践中可能会被内部进行三个函数调用的潜在费用所抵消....只有基准才能真正说明.

  • 我喜欢这种简单的递归结构. (2认同)