我正在尝试用非常大的数组(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),我得到排序的数组。但我宁愿在准备好时得到结果,例如回调。我只是想不出如何将回调附加到排序函数。我觉得我缺少一些基本的东西。
答案 0 :(得分:0)
Array.sort
)时, NaN
可能会表现得很奇怪。确保您不像自己那样返回NaN的一种常见方法是检查a
和b
是否有限
我建议你重写类似于:
的排序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
});