如何确保数组在JavaScript中排序?

时间:2014-02-02 15:36:30

标签: javascript ajax node.js sorting express

我正在尝试用非常大的数组(5k +)做这样的事情:

    exports.sortedArray = function(req,res){

    var fs = require("fs");
    var path = 'somePath.txt';

    //async
    fs.readFile(path, function(err,f){
        var incoming = f.toString();
        //var returner = csvarray(incoming);
        var returner = incoming.split("\n");
        for (var i=0;i<returner.length;i++){
            returner[i] = returner[i].split(",");
        }
        returner.sort(function(a,b){
            return b[3]-a[3];
        });

        res.json(returner);
    })
}

文件被读取。 csv字符串转换为数组。但是该函数在排序之前返回数组。

上面的代码是运行node.js和express的服务器的ajax响应。如果我在Ajax调用的另一端对数组进行排序,即'console.log(result);',我会遇到同样的问题。在浏览器中而不是服务器上的“res.json”。打印的数组仍未排序。

我尝试了几种hacky解决方案。如果我停止返回(例如使用setTimeout),我得到排序的数组。但我宁愿在准备好时得到结果,例如回调。我只是想不出如何将回调附加到排序函数。我觉得我缺少一些基本的东西。

1 个答案:

答案 0 :(得分:0)

当您返回不可比较的项目(例如Array.sort)时,

NaN可能会表现得很奇怪。确保您不像自己那样返回NaN的一种常见方法是检查ab是否有限

我建议你重写类似于:

的排序
returner.sort(function(a,b){
    var aFinite = isFinite(a[3]), bFinite = isFinite(b[3]);
    if(!aFinite || !bFinite) {
       if(bFinite) return 1;
       if(aFinite) return -1;
       return 0;//both not finite
    }
    return b[3]-a[3];
});

我认为这也应该有用

returner.sort(function(a,b){
    var aFinite = isFinite(a[3]), bFinite = isFinite(b[3]);
    return aFinite && bFinite ? b[3]-a[3] : aFinite-bFinite;//noting that a true - false = 1, false - true = -1 etc
});