programing

클라이언트 측 객체 배열에서 최신 날짜를 얻는 우아한 방법은 무엇입니까?

instargram 2023. 2. 21. 23:23
반응형

클라이언트 측 객체 배열에서 최신 날짜를 얻는 우아한 방법은 무엇입니까?

나는 프로젝트에서 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];
  1. a.map 개체 배열에서 날짜를 가져옵니다.
  2. new Date각 날짜에 적용되어 날짜 개체를 만듭니다.
  3. Math.max.apply 최신 검색
  4. 가장 최근의 날짜를 찾았습니다. 이제 개체가 필요합니다.
  5. a.filter원본을 통과하다a어레이를 설정합니다.
  6. 날짜를 비교할 방법이 필요하기 때문에 1970년 1월 1일 이후 밀리초 수를 반환하는 를 사용합니다.이 값은 시간과 날짜를 고려합니다(정의되어 있는 경우).
  7. 정확한 날짜가 발견되면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

퍼포먼스로 평가된 답변:

  1. data.reduce((a, b) => a.MeasureDate > b.MeasureDate ? a : b).MeasureDate
  2. data.map(e => e.MeasureDate).reduce((a, b) => a > b ? a : b)
  3. 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

반응형