Node.js中按时间戳排序二维数组?原代码火狐有效Node无效果
解决Node.js中二维数组按时间戳排序无效的问题
哈哈,这个坑我之前也踩过!问题根源在于你传给sort()的比较函数返回值不符合标准——Firefox的JS引擎可能做了兼容,但Node.js用的V8引擎严格遵循ECMAScript标准,sort()的比较函数必须返回负数、0或者正数,而不是布尔值。
为什么原来的代码在Node.js里没效果?
你写的return (d1 > d2);会返回true或false,在V8引擎中,布尔值会被隐式转换成1或0,但这没法正确表达排序所需的“小于、等于、大于”三种关系,最终导致排序逻辑混乱,看起来就像没生效一样。
正确的写法
我们只需要把比较函数的返回值改成两个Date对象的时间戳差值就行——因为Date对象相减时会自动转为毫秒级时间戳,返回的数字正好符合sort()的要求:
- 返回负数:a的时间早于b,a排在b前面(升序)
- 返回0:两者时间相同,顺序不变
- 返回正数:a的时间晚于b,a排在b后面
完整代码如下:
var arr = [ ["USER1", "2018-03-23T15:36", "S128290"], ["USER2", "2018-03-23T14:26", "S378256"], ["USER3", "2018-03-23T15:15", "S537524"] ]; arr.sort(function(a, b){ const d1 = new Date(a[1]); const d2 = new Date(b[1]); // 按时间升序排列(从早到晚),如果要降序就换成 d2 - d1 return d1 - d2; }); console.log(arr);
运行这段代码后,你会得到正确的排序结果:
[ ["USER2", "2018-03-23T14:26", "S378256"], ["USER3", "2018-03-23T15:15", "S537524"], ["USER1", "2018-03-23T15:36", "S128290"] ]
额外提示
如果你想简化代码,还可以直接用时间字符串转成的Date对象的getTime()方法来计算差值,效果是完全一样的:
return d1.getTime() - d2.getTime();
内容的提问来源于stack exchange,提问作者Azevedo
相关产品推荐
相关产品推荐

