Javascript 从客户端的对象数组中获取最新日期的优雅方式是什么?
我在项目中使用angularjs 我从服务器获取对象数组。 每个对象包含几个属性,其中一个是日期属性 以下是我从服务器获取的数组(json):Javascript 从客户端的对象数组中获取最新日期的优雅方式是什么?,javascript,jquery,angularjs,Javascript,Jquery,Angularjs,我在项目中使用angularjs 我从服务器获取对象数组。 每个对象包含几个属性,其中一个是日期属性 以下是我从服务器获取的数组(json): [ { "Address": 25, "AlertType": 1, "Area": "North", "MeasureDate": "2019-02-01T00:01:01.001Z", "MeasureValue": -1 }, { "Address": 26, "AlertType
[
{
"Address": 25,
"AlertType": 1,
"Area": "North",
"MeasureDate": "2019-02-01T00:01:01.001Z",
"MeasureValue": -1
},
{
"Address": 26,
"AlertType": 1,
"Area": "West",
"MeasureDate": "2016-04-12T15:13:11.733Z",
"MeasureValue": -1
},
{
"Address": 25,
"AlertType": 1,
"Area": "North",
"MeasureDate": "2017-02-01T00:01:01.001Z",
"MeasureValue": -1
}
.
.
.
]
我需要从阵列中获取最新日期
从对象数组中获取最新日期的优雅方法是什么?一种干净的方法是将每个日期转换为
日期()
,并取最大值
ES6:
new Date(Math.max(...a.map(e => new Date(e.MeasureDate))));
new Date(Math.max.apply(null, a.map(function(e) {
return new Date(e.MeasureDate);
})));
JS:
new Date(Math.max(...a.map(e => new Date(e.MeasureDate))));
new Date(Math.max.apply(null, a.map(function(e) {
return new Date(e.MeasureDate);
})));
其中a
是对象数组
这样做的目的是将数组中的每个对象映射到使用值MeasureDate
创建的日期。然后将此映射数组应用于Math.max
函数以获取最新日期,并将结果转换为日期
通过将字符串日期映射到JS Date对象,您最终将使用如下解决方案
--
一个不太干净的解决方案是简单地将对象映射到MeasureDate
的值,并对字符串数组进行排序。这只适用于您使用的特定日期格式
a.map(function(e) { return e.MeasureDate; }).sort().reverse()[0]
如果性能是一个问题,您可能希望减少
数组以获得最大值,而不是使用排序
和反向
function getLatestDate(data) {
// convert to timestamp and sort
var sorted_ms = data.map(function(item) {
return new Date(item.MeasureDate).getTime()
}).sort();
// take latest
var latest_ms = sorted_ms[sorted_ms.length-1];
// convert to js date object
return new Date(latest_ms);
}
var data = [{MeasureDate: "2014-10-04T16:10:00"},
{MeasureDate: "2013-10-04T16:10:00"},
{MeasureDate: "2012-10-04T16:10:00"}];
getLatestDate(data).toString(); // "Sat Oct 04 2014 18:10:00 GMT+0200 (CEST)"
此函数将最新日期作为JavaScript日期对象返回。还可以使用日期对象方法toISOString()将其转换为ISO字符串(源数据的格式)
正如您所看到的,该方法的结果最后总是包含零毫秒。如果因此需要原始ISO数据字符串,则可能需要使用以下函数:
function getLatestDate2(data) {
var sorted = data.map(function(item) {
var MeasureDate = item.MeasureDate;
return {original_str: MeasureDate,
in_ms: (new Date(MeasureDate)).getTime()}
}).sort(function(item1, item2) {
return (item1.in_ms < item2.in_ms)
});
// take latest
var latest = sorted[0];
return latest.original_str;
}
getLatestDate2(data); // "2014-10-04T16:10:00"
函数getLatestDate2(数据){
var sorted=data.map(函数(项){
var MeasureDate=项目被测日期;
返回{original_str:MeasureDate,
in_ms:(新日期(MeasureDate)).getTime()}
}).sort(函数(项1、项2){
返回(项目1.in\ms<项目2.in\ms)
});
//最新
var latest=已排序[0];
返回最新的.original_str;
}
getLatestDate2(数据);//“2014-10-04T16:10:00”
受本帖中许多建议和评论的启发,下面是解决此问题的另一个解决方案。它非常快,因为没有日期对象转换
function getLatestDate(xs) {
if (xs.length) {
return xs.reduce((m, i) => (i.MeasureDate > m) && i || m, "")
.MeasureDate;
}
}
以下是浏览器不支持箭头功能的版本:
function getLatestDateSave(xs) {
if (xs.length) {
return xs.reduce(function(m, i) {
return (i.MeasureDate > m) && i || m;
}, "").MeasureDate;
}
}
修改Anton Harald的回答:我使用的数组使用ModDate而不是MeasureDate。我选择最近的日期。这很有效
getLatestDate(xs) {
if (xs.length) {
return xs.reduce((m,v,i) => (v.ModDate > m.ModDate) && i ? v : m).ModDate;
}
}
m=蓄能器,v=电流,i=指数
环境:TypeScript,ES6如果您想要获取整个对象,而不仅仅是日期 如果OP的对象数组被分配给
a
,这就是您获取具有最新日期的对象的方式:
var mostRecentDate = new Date(Math.max.apply(null, a.map( e => {
return new Date(e.MeasureDate);
})));
var mostRecentObject = a.filter( e => {
var d = new Date( e.MeasureDate );
return d.getTime() == mostRecentDate.getTime();
})[0];
新日期
应用于每个日期,生成对象a.filter
在原始a
数组中循环true
,而.filter
只提供该对象注:此解决方案是上述@archyqwerty答案的扩展。他们的解决方案只提供了一组对象中最近的日期,这个解决方案提供了该日期所属的整个对象 根据@Travis Heeter的回答,这将返回包含最新日期的对象:
array.reduce((a,b)=>(a.MeasureDate>b.MeasureDate?a:b))代码>
更可靠的解决方案可能是每次都将字符串转换为Date
对象。如果处理(非常)大的阵列,速度可能会明显减慢:
array.reduce((a, b) => {
return new Date(a.MeasureDate) > new Date(b.MeasureDate) ? a : b;
});
还有@TravisHeeter的回答
您可以使用.find()方法代替使用“filter”并获取[0]的数组索引,如下所示:
....
const mostRecentObject = a.find( e => {
const d = new Date( e.MeasureDate );
return d.getTime() == mostRecentDate.getTime();
});
这也使代码的性能更高,因为它在找到结果后将停止查找,而不是对数组中的所有对象进行迭代的筛选。这就是我选择lasest/highest date的方式
var maxLastseen= obj.sort((a,b) => new Date(b.lastS).getTime() - new Date(a.lastS).getTime())[0];
循环查找最新日期。@epascarello,我是否必须将其转换为日期javascript对象。是的,您需要将字符串转换为日期。您不需要转换它。可以按原样订购。而且,事实上,有一些论点认为,引入转换为引入更多可能出现问题的领域(解析等)打开了大门。您不必转换它,因为您选择了特定的格式。我认为最好进行转换,因为如果您的应用程序使用不同的格式或接受多种格式,那么这可能会中断,而将其解析为日期,然后排序可以确保它确实是最新的日期(不一定是最后排序的字符串)。例如,如果您开始接受MM/DD/YYYY日期,那么字符串顺序可能与日期顺序截然不同。有趣的解决方案。不知道可以立即将日期对象应用于Math.max.ES6:新日期(Math.max(…a.map(a=>newdate(a.MeasureDate));如何取回整个对象而不仅仅是日期?可能有一种更简单的方法,但我必须编写另一个函数来获取对象:因此,您的函数给出了一个日期,假设它被分配给varmostRecentDate
。然后我可以这样做来获取对象:var mostRecentObject=a.filter(e=>{var d=newdate(e.MeasureDate);返回d.getTime()==mostRecentDate.getTime();})[0]代码>你是一个传奇人物你在使用哪个浏览器?也许它不支持箭头功能。请参见此处的更多详细信息:添加了