Tôi sử dụng angularjs trong dự án.
Tôi nhận được mảng các đối tượng từ máy chủ. Mỗi đối tượng chứa một vài thuộc tính và một trong số chúng là thuộc tính ngày.
Đây là mảng [trong JSON] mà tôi nhận được từ máy chủ:
[
{
"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
}
.
.
.
]
Tôi cần có được ngày mới nhất từ mảng.
Cách thanh lịch để có được ngày mới nhất từ mảng các đối tượng là gì?
Astaroth
7536 Huy hiệu bạc24 Huy hiệu Đồng6 silver badges24 bronze badges
Hỏi ngày 12 tháng 4 năm 2016 lúc 15:05Apr 12, 2016 at 15:05
5
Một cách sạch sẽ để chuyển đổi mỗi ngày thành
new Date[Math.max[...a.map[e => new Date[e.MeasureDate]]]];
6 và lấy tối đaES6:
new Date[Math.max[...a.map[e => new Date[e.MeasureDate]]]];
JS:
new Date[Math.max.apply[null, a.map[function[e] {
return new Date[e.MeasureDate];
}]]];
trong đó
new Date[Math.max[...a.map[e => new Date[e.MeasureDate]]]];
7 là mảng của các đối tượng.Những gì điều này làm là ánh xạ từng đối tượng trong mảng đến một ngày được tạo với giá trị
new Date[Math.max[...a.map[e => new Date[e.MeasureDate]]]];
8. Mảng ánh xạ này sau đó được áp dụng cho hàm new Date[Math.max[...a.map[e => new Date[e.MeasureDate]]]];
9 để có được ngày mới nhất và kết quả được chuyển đổi thành một ngày.Bằng cách ánh xạ các ngày chuỗi vào các đối tượng ngày JS, cuối cùng bạn sử dụng một giải pháp như min/max của ngày trong một mảng?
-
Một giải pháp ít sạch sẽ là chỉ đơn giản là ánh xạ các đối tượng theo giá trị của
new Date[Math.max[...a.map[e => new Date[e.MeasureDate]]]];
8 và sắp xếp mảng chuỗi. Điều này chỉ hoạt động vì định dạng ngày cụ thể bạn đang sử dụng.a.map[function[e] { return e.MeasureDate; }].sort[].reverse[][0]
Nếu hiệu suất là một mối quan tâm, bạn có thể muốn
new Date[Math.max.apply[null, a.map[function[e] {
return new Date[e.MeasureDate];
}]]];
1 mảng để có được mức tối đa thay vì sử dụng new Date[Math.max.apply[null, a.map[function[e] {
return new Date[e.MeasureDate];
}]]];
2 và new Date[Math.max.apply[null, a.map[function[e] {
return new Date[e.MeasureDate];
}]]];
3.Đã trả lời ngày 12 tháng 4 năm 2016 lúc 16:22Apr 12, 2016 at 16:22
arcyqwertyarcyqwertyarcyqwerty
9,9233 Huy hiệu vàng45 Huy hiệu bạc83 Huy hiệu đồng3 gold badges45 silver badges83 bronze badges
7
Hơn nữa cho câu trả lời của @Travis Heeter, điều này trả về đối tượng chứa ngày mới nhất:
new Date[Math.max.apply[null, a.map[function[e] {
return new Date[e.MeasureDate];
}]]];
4Một giải pháp mạnh mẽ hơn có lẽ có thể chuyển đổi các chuỗi thành các đối tượng
new Date[Math.max.apply[null, a.map[function[e] {
return new Date[e.MeasureDate];
}]]];
5 mỗi lần. Có thể chậm hơn đáng kể nếu giao dịch với [rất] các mảng lớn:array.reduce[[a, b] => {
return new Date[a.MeasureDate] > new Date[b.MeasureDate] ? a : b;
}];
Đã trả lời ngày 30 tháng 8 năm 2019 lúc 17:49Aug 30, 2019 at 17:49
YorkshiremanyorkshiremanYorkshireman
2.1051 Huy hiệu vàng21 Huy hiệu bạc35 Huy hiệu đồng1 gold badge21 silver badges35 bronze badges
3
Nếu bạn muốn có được toàn bộ đối tượng, không chỉ là ngày ...
Nếu mảng đối tượng của OP được gán cho
new Date[Math.max[...a.map[e => new Date[e.MeasureDate]]]];
7 thì đây là cách bạn có được đối tượng với ngày gần đây nhất: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];
7 Nhận ngày từ mảng các đối tượng.new Date[Math.max.apply[null, a.map[function[e] { return new Date[e.MeasureDate]; }]]];
8 được áp dụng cho mỗi ngày, làm cho các đối tượng ngàynew Date[Math.max.apply[null, a.map[function[e] { return new Date[e.MeasureDate]; }]]];
9 tìm thấy gần đây nhấtnew Date[Math.max.apply[null, a.map[function[e] { return new Date[e.MeasureDate]; }]]];
- Chúng tôi đã tìm thấy ngày gần đây nhất, bây giờ chúng tôi cần đối tượng.
0 Vòng lặp qua mảnga.map[function[e] { return e.MeasureDate; }].sort[].reverse[][0]
7 ban đầu.new Date[Math.max[...a.map[e => new Date[e.MeasureDate]]]];
- Chúng tôi cần một số cách để so sánh ngày, vì vậy chúng tôi sử dụng
2, trả về số mili giây kể từ ngày 01/01/1970. Điều này sẽ chiếm thời gian - nếu nó được xác định - cũng như ngày.a.map[function[e] { return e.MeasureDate; }].sort[].reverse[][0]
- Khi ngày chính xác được tìm thấy,
3 được trả lại vàa.map[function[e] { return e.MeasureDate; }].sort[].reverse[][0]
4 cho chúng ta chỉ là đối tượng đó.a.map[function[e] { return e.MeasureDate; }].sort[].reverse[][0]
Lưu ý: Giải pháp này là một phần mở rộng của câu trả lời của @archyqwerty ở trên. Giải pháp của họ chỉ đưa ra ngày gần đây nhất từ một loạt các đối tượng, giải pháp này cung cấp cho bạn toàn bộ đối tượng rằng ngày là thành viên của.
Đã trả lời ngày 12 tháng 2 năm 2019 lúc 15:51Feb 12, 2019 at 15:51
Travis HeeterTravis HeeterTravis Heeter
12.1k13 Huy hiệu vàng81 Huy hiệu bạc124 Huy hiệu đồng13 gold badges81 silver badges124 bronze badges
0
Sửa đổi câu trả lời của Anton Harald: mảng tôi đã sử dụng moddate thay vì đo. Tôi đang chọn ngày gần đây nhất. Những công việc này.
getLatestDate[xs] {
if [xs.length] {
return xs.reduce[[m,v,i] => [v.ModDate > m.ModDate] && i ? v : m].ModDate;
}
}
M = Accumulator, V = hiện tại, I = Index
Môi trường: TypeScript, ES6
Đã trả lời ngày 10 tháng 1 năm 2017 lúc 22:41Jan 10, 2017 at 22:41
2
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]"
Hàm này trả về ngày mới nhất dưới dạng đối tượng ngày JavaScript. Bạn cũng có thể biến nó thành một chuỗi ISO [định dạng dữ liệu nguồn của bạn] bằng phương thức đối tượng ngày toisoString [].
var date_str = "2012-10-04T16:10:00";
[new Date[date_str]].toISOString[]; // "2012-10-04T16:10:00.000Z"
Như bạn có thể thấy kết quả của phương pháp bao gồm cuối cùng không có mili giây. Nếu bạn cần chuỗi dữ liệu ISO gốc của mình, bạn có thể muốn đi với chức năng sau:
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"
Đã trả lời ngày 12 tháng 4 năm 2016 lúc 16:25Apr 12, 2016 at 16:25
Anton Haraldanton HaraldAnton Harald
5.6824 Huy hiệu vàng21 Huy hiệu bạc57 Huy hiệu đồng4 gold badges21 silver badges57 bronze badges
Câu trả lời được đánh giá bởi hiệu suất:
5a.map[function[e] { return e.MeasureDate; }].sort[].reverse[][0]
6a.map[function[e] { return e.MeasureDate; }].sort[].reverse[][0]
7a.map[function[e] { return e.MeasureDate; }].sort[].reverse[][0]
[giả sử x là mảng]
Đã trả lời ngày 6 tháng 3 lúc 22:09Mar 6 at 22:09
Ngoài ra hơn nữa cho câu trả lời của @Travisheeter ..
Thay vì sử dụng 'bộ lọc' và lấy chỉ mục mảng của [0], bạn có thể sử dụng phương thức .find [] thay vào đó như sau:
new Date[Math.max[...a.map[e => new Date[e.MeasureDate]]]];
0Điều này cũng làm cho mã hoạt động nhiều hơn, vì nó sẽ ngừng chăm sóc nó đã tìm thấy kết quả, thay vì lọc sẽ lặp lại trên tất cả các đối tượng trong mảng.
Đã trả lời ngày 21 tháng 11 năm 2019 lúc 12:48Nov 21, 2019 at 12:48
AlexalexAlex
1.19815 huy hiệu bạc26 Huy hiệu đồng15 silver badges26 bronze badges
Bằng cách này, bạn có thể nhận được toàn bộ đối tượng - tôi chỉ câu lạc bộ quá trình mà tôi đã học được từ câu trả lời của Travis Heeter:
new Date[Math.max[...a.map[e => new Date[e.MeasureDate]]]];
1
Zach Jensz
3.1295 Huy hiệu vàng13 Huy hiệu bạc28 Huy hiệu đồng5 gold badges13 silver badges28 bronze badges
Đã trả lời ngày 22 tháng 6 lúc 10:08Jun 22 at 10:08
Lấy cảm hứng từ nhiều đề xuất và nhận xét trong chủ đề này, đây là một giải pháp khác cho vấn đề. Nó rất nhanh, vì không có sự chuyển đổi đối tượng ngày.
new Date[Math.max[...a.map[e => new Date[e.MeasureDate]]]];
2Đây là phiên bản cho các chức năng mũi tên không hỗ trợ của trình duyệt:
new Date[Math.max[...a.map[e => new Date[e.MeasureDate]]]];
3Đã trả lời ngày 12 tháng 4 năm 2016 lúc 17:11Apr 12, 2016 at 17:11
Anton Haraldanton HaraldAnton Harald
5.6824 Huy hiệu vàng21 Huy hiệu bạc57 Huy hiệu đồng4 gold badges21 silver badges57 bronze badges
3
Đây là cách tôi chọn lasest/ngày cao nhất
new Date[Math.max[...a.map[e => new Date[e.MeasureDate]]]];
4Đã trả lời ngày 18 tháng 11 năm 2020 lúc 7:35Nov 18, 2020 at 7:35
R15R15R15
12K14 Huy hiệu vàng83 Huy hiệu bạc148 Huy hiệu đồng14 gold badges83 silver badges148 bronze badges
new Date[Math.max[...a.map[e => new Date[e.MeasureDate]]]];
5Đã trả lời ngày 31 tháng 8 năm 2019 lúc 11:02Aug 31, 2019 at 11:02
3