Sort array by date gives unexpected results

short answer

You should return the difference between the two dates, not a boolean:

// sort the data by date using moment.js
seriesRawDataArray.sort(function (left, right) {
    return moment.utc(left.timeStamp).diff(moment.utc(right.timeStamp))
});

why

Array.prototype.sort expects a negative, zero, or positive value to be returned. Generally, you’ll write a sort function like this:

yourArray.sort(function (a, b) {
    if (a < b) {            // a comes first
        return -1
    } else if (b < a) {     // b comes first
        return 1
    } else {                // equal, so order is irrelevant
        return 0            // note: sort is not necessarily stable in JS
    }
})

The anonymous function passed to sort serves as the comparator for the native implementation of the sort function.

However, your negative value doesn’t have to be -1 and your positive value doesn’t have to be +1. Therefore, when sorting numbers, you can instead use the shortcut:

yourArray.sort(function (a, b) {
    return a - b
})

In JavaScript, subtracting two dates coerces them both into numbers, which is why we could use return moment.utc(left.timeStamp).diff(moment.utc(right.timeStamp))

(instead of direct subtraction -, this method uses moment.prototype.diff from the moment.js library)

However, in your code, you returned diff > 0, which can be either true or false. Because of type coercion, JavScript will read true as 1 and false as 0. This means your sort function will never return -1. Therefore, your elements will not be sorted correctly.

Leave a Comment

Hata!: SQLSTATE[HY000] [1045] Access denied for user 'divattrend_liink'@'localhost' (using password: YES)