클라이언트 측 객체 배열에서 최신 날짜를 얻는 우아한 방법은 무엇입니까?
나는 프로젝트에서 angularjs를 사용한다.
서버에서 객체 배열을 가져옵니다.각 개체에는 몇 가지 속성이 포함되어 있으며 그 중 하나가 날짜 속성입니다.
서버로부터 취득한 어레이(단위는 json)를 다음에 나타냅니다.
[
{
"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
}
.
.
.
]
배열에서 최신 날짜를 가져와야 합니다.
다양한 객체에서 최신 날짜를 얻을 수 있는 우아한 방법은 무엇입니까?
이를 위한 깔끔한 방법은 각 날짜를 다음 날짜로 변환하는 것입니다.Date()
최대한으로
ES6:
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);
})));
어디에a
는 객체의 배열입니다.
이렇게 하면 어레이 내의 각 개체가 다음 값으로 작성된 날짜에 매핑됩니다.MeasureDate
이 매핑된 배열은 다음에 에 적용됩니다.Math.max
최신 날짜를 가져오고 결과를 날짜로 변환하는 함수입니다.
문자열 날짜를 JS 날짜 개체에 매핑하면 어레이에서 최소/최대 날짜 등의 솔루션을 사용하게 됩니까?
--
덜 깨끗한 솔루션은 단순히 객체를 다음과 같은 가치에 매핑하는 것입니다.MeasureDate
문자열 배열을 정렬합니다.이것은 사용하고 있는 특정 날짜 형식 때문에만 유효합니다.
a.map(function(e) { return e.MeasureDate; }).sort().reverse()[0]
퍼포먼스가 걱정되는 경우는,reduce
사용하는 대신 최대값을 얻기 위한 배열sort
그리고.reverse
.
@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;
});
날짜뿐만 아니라 전체 개체를 가져오려면...
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.map
개체 배열에서 날짜를 가져옵니다.new Date
각 날짜에 적용되어 날짜 개체를 만듭니다.Math.max.apply
최신 검색- 가장 최근의 날짜를 찾았습니다. 이제 개체가 필요합니다.
a.filter
원본을 통과하다a
어레이를 설정합니다.- 날짜를 비교할 방법이 필요하기 때문에 1970년 1월 1일 이후 밀리초 수를 반환하는 를 사용합니다.이 값은 시간과 날짜를 고려합니다(정의되어 있는 경우).
- 정확한 날짜가 발견되면
true
이 반환되고 있습니다..filter
바로 그 대상을 우리에게 준다.
주의: 이 솔루션은 위의 @archyqwerty 답변의 확장입니다.솔루션에서는 일련의 오브젝트로부터 최신 날짜만 제공되며, 이 솔루션은 해당 날짜가 멤버였던 오브젝트 전체를 제공합니다.
Anton Harald의 답변 수정:가지고 있는 어레이는 MeasureDate가 아닌 ModDate를 사용합니다.저는 가장 최근 날짜를 선택하고 있습니다.이거 되는구나.
getLatestDate(xs) {
if (xs.length) {
return xs.reduce((m,v,i) => (v.ModDate > m.ModDate) && i ? v : m).ModDate;
}
}
m = 축전지, v = 전류, i = 인덱스
환경:TypeScript, ES6
퍼포먼스로 평가된 답변:
data.reduce((a, b) => a.MeasureDate > b.MeasureDate ? a : b).MeasureDate
data.map(e => e.MeasureDate).reduce((a, b) => a > b ? a : b)
new Date(Math.max.apply(null, data.map(e => new Date(e.MeasureDate)))).toISOString()
(x는 어레이)
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 날짜 개체로 반환합니다.Date-Object 메서드 toISOString()을 사용하여 ISO-String(소스 데이터 형식)으로 변환할 수도 있습니다.
var date_str = "2012-10-04T16:10:00";
(new Date(date_str)).toISOString(); // "2012-10-04T16:10:00.000Z"
보시다시피 이 메서드의 결과는 마지막에 항상 0밀리초를 포함합니다.따라서 원래 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"
또, @TravisHeeter의 답변에 대해서는,
'filter'를 사용하여 [0]의 배열 인덱스를 가져오는 대신 다음과 같이 .find() 메서드를 사용할 수 있습니다.
....
const mostRecentObject = a.find( e => {
const d = new Date( e.MeasureDate );
return d.getTime() == mostRecentDate.getTime();
});
또, 코드의 퍼포먼스가 향상됩니다.이것은, 어레이내의 모든 오브젝트에 대해서 반복하는 필터가 아니고, 결과를 검출한 후에 처리를 정지하기 때문입니다.
이것으로, 모든 오브젝트를 얻을 수 있습니다.Travis Heeter의 대답으로부터 배운 프로세스를 클럽으로 정리했습니다.
let latestDate = Math.max(...a.map((ele) => new Date(ele.dof)));
latestDate = new Date(latestDate);
console.log(latestDate);
let latestObject = a.filter((ele) => {
let date = new Date(ele.dof);
return date.getTime() === latestDate.getTime();
});
이 스레드의 많은 제안과 코멘트에서 영감을 얻어 이 문제에 대한 또 다른 해결책을 제시합니다.날짜 객체 변환이 없기 때문에 매우 빠릅니다.
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;
}
}
이렇게 해서 Lasest/highest date를 골랐습니다.
var maxLastseen= obj.sort((a,b) => new Date(b.lastS).getTime() - new Date(a.lastS).getTime())[0];
var dates = [];
dates.push(new Date("2019/06/25"));
dates.push(new Date("2019/06/26"));
dates.push(new Date("2019/06/27"));
dates.push(new Date("2019/06/28"));
function GFG_Fun() {
var maximumDate=new Date(Math.max.apply(null, dates));
var minimumDate=new Date(Math.min.apply(null, dates));
}
언급URL : https://stackoverflow.com/questions/36577205/what-is-the-elegant-way-to-get-the-latest-date-from-array-of-objects-in-client-s
'programing' 카테고리의 다른 글
오류: [$compile:nonassign] 지시문 'myFacebook'과 함께 사용되는 표현식 'undefined'는 할당할 수 없습니다. (0) | 2023.02.21 |
---|---|
Woocommerce - php를 사용하여 주문 정보를 가져옵니다. (0) | 2023.02.21 |
jquery에서 외부 URL을 호출하는 방법 (0) | 2023.02.21 |
특정 사용자가 소유한 모든 테이블에서 선택 허용 (0) | 2023.02.21 |
각을 사용하여 중첩된 양식 유효성 검사 건너뛰기JS (0) | 2023.02.21 |