作者:手机用户2602907485 | 来源:互联网 | 2023-05-26 11:18
这听起来像一个简单的问题,但我花了我的星期天试图找出下面描述的我的实现有什么问题所以我作为最后的手段将它发布到SO.
我有一个从服务器接收数据结构的Javascript应用程序.出于性能原因,服务器端发送未排序的数据.
以下是接收数据的Javascript代码片段:
var seriesRawDataArray = ko.observableArray();
...
analyticscontext.series(seriesRawDataArray).done(function () {
renderSeries();
});
该analyticscontext
模块查询使用AJAX的数据:
function series(seriesData) {
return $.ajax({
url: "/api/analytics/series",
type: "GET",
success: function (data) {
return seriesData(data);
}
});
}
在renderSeries
执行渲染它之前的数据排序:
// Sort the data by date using moment.js
seriesRawDataArray.sort(function (left, right) {
var leftDate = moment.utc(left.timeStamp);
var rightDate = moment.utc(right.timeStamp);
var diff = leftDate.diff(rightDate);
return diff > 0;
});
问题
这是我从服务器收到的数据样本:
注意最后的未分类项目.在seriesRawDataArray.sort
似乎有原来的阵列,它没有得到不管我在分类方法发生变化排序没有影响.输出总是:
注意这里的未排序元素.我正在使用的库和数据肯定不是问题,因为这个jsfiddle运行得很好!这段代码有问题吗?
1> royhowie..:
简短的回答
您应该返回两个日期之间的差异,而不是布尔值:
// sort the data by date using moment.js
seriesRawDataArray.sort(function (left, right) {
return moment.utc(left.timeStamp).diff(moment.utc(right.timeStamp))
});
为什么
Array.prototype.sort
期望返回负值,零值或正值.通常,您将编写如下的排序函数:
yourArray.sort(function (a, b) {
if (a
传递给sort的匿名函数充当sort函数的本机实现的比较器.
但是,您的负值不一定是-1
,您的正值不一定是+1
.因此,在排序数字时,您可以使用快捷方式:
yourArray.sort(function (a, b) {
return a - b
})
在Javascript中,减去两个日期会将它们强制转换为数字,这就是我们可以使用的原因 return moment.utc(left.timeStamp).diff(moment.utc(right.timeStamp))
(而不是直接减法-
,此方法使用moment.prototype.diff
来自moment.js
库)
但是,在您的代码中,您返回了diff > 0
,可以是true
或者false
.由于类型强制,JavScript将读true
作as 1
和false
as 0
.这意味着您的排序功能永远不会返回-1
.因此,您的元素将无法正确排序.
2> 小智..:
let sortedDates = dates.sort(function(a, b){
return moment(b).format('X')-moment(a).format('X')
});
由于moment可以格式化有效日期,因此最好的方法是使用Javascript的sort方法,因此在将日期格式化为时间戳时,基本上是按数字排序。
参考文献:
http://www.momentjs.com/docs/#/displaying/format
http://www.w3schools.com/jsref/jsref_sort.asp