Как проверить два объекта с одинаковой датой и сохранить только самый последний объект даты на основе часов (момент. js) - PullRequest
0 голосов
/ 12 марта 2020

Данный массив:

  var array1=[
      {
        "id": 57,
        "name": " Miles Weekly Report (Date Compare)",
        "status": 2,
        "createdAt": "2019-06-07T09:21:16.027",
        "header": " Miles Weekly Report (Date Compare)"
      },
      {
        "id": 56,
        "name": " PRVI ABCD Weekly Report",
        "status": 2,
        "createdAt": "2019-05-24T03:22:43.743",
        "header": " PRVI ABCD Weekly Report"
      },
      {
        "id": 55,
        "name": " Lady's Card Weekly Report",
        "status": 2,
        "createdAt": "2019-04-23T06:27:04.347",
        "header": " Lady's Card Weekly Report"
      }
      {
        "id": 8,
        "name": "Demo | Monthly  Report - September 2019",
        "status": 2,
        "createdAt": "2019-10-08T05:24:55.203",
        "header": "Demo | Monthly  Report - September 2019"
      },
      {
        "id": 7,
        "name": "Demo | Monthly  Report - September 2019",
        "status": 2,
        "createdAt": "2019-10-08T03:35:24.74",
        "header": "Demo | Monthly  Report - September 2019"
      },
      {
        "id": 6,
        "name": "Demo | Monthly  Report - September 2019",
        "status": 2,
        "createdAt": "2019-10-08T03:31:40.323",
        "header": "Demo | Monthly  Report - September 2019"
      },
      {
        "id": 5,
        "name": "Demo | Monthly  Report - September 2019",
        "status": 2,
        "createdAt": "2019-10-03T08:11:01.167",
        "header": "Demo | Monthly  Report - September 2019"
      },
      {
        "id": 4,
        "name": "Demo | Monthly  Report - September 2019",
        "status": 2,
        "createdAt": "2019-10-03T08:09:17.33",
        "header": "Demo | Monthly  Report - September 2019"
      },
      {
        "id": 3,
        "name": "Demo | Monthly  Report - September 2019",
        "status": 2,
        "createdAt": "2019-10-03T08:04:54.13",
        "header": "Demo | Monthly  Report - September 2019"
      },
      {
        "id": 2,
        "name": "Demo | Monthly  Report - September 2019",
        "status": 2,
        "createdAt": "2019-10-01T02:57:46.573",
        "header": "Demo | Monthly  Report - September 2019"
      },
      {
        "id": 1,
        "name": "Demo | Monthly  Report - September 2019",
        "status": 2,
        "createdAt": "2019-10-01T02:44:04.49",
        "header": "Demo | Monthly  Report - September 2019"
      }
    ]

Чего я пытаюсь достичь

var array1=[
      {
        "id": 57,
        "name": " Miles Weekly Report (Date Compare)",
        "status": 2,
        "createdAt": "2019-06-07T09:21:16.027",
        "header": " Miles Weekly Report (Date Compare)"
      },
      {
        "id": 56,
        "name": " PRVI ABCD Weekly Report",
        "status": 2,
        "createdAt": "2019-05-24T03:22:43.743",
        "header": " PRVI ABCD Weekly Report"
      },
      {
        "id": 55,
        "name": " Lady's Card Weekly Report",
        "status": 2,
        "createdAt": "2019-04-23T06:27:04.347",
        "header": " Lady's Card Weekly Report"
      }
      {
        "id": 8,
        "name": "Demo | Monthly  Report - September 2019",
        "status": 2,
        "createdAt": "2019-10-08T05:24:55.203",
        "header": "Demo | Monthly  Report - September 2019"
      }
      {
        "id": 5,
        "name": "Demo | Monthly  Report - September 2019",
        "status": 2,
        "createdAt": "2019-10-03T08:11:01.167",
        "header": "Demo | Monthly  Report - September 2019"
      }
    ]

Это то, что я пытался до сих пор ,

array1.forEach(a=>{
console.log(a.id,"a");

console.log("---------------");
array2.filter(a2=>{
if(moment(a.createdAt)!=moment(a2.createdAt)){
return a
}
});
/* array2.forEach(b=>{
  if(moment(a.createdAt)==moment(b.createdAt)){

console.log(b.id,"b")
  } 
}) */

console.log("---------------");
});

Я новичок ie в понимании массивов и моментов. js, пытался ломать мне голову часами, любые предложения будут полезны. Мое понимание до сих пор: 1. Получите копию исходного массива 2. Сравните оба массива для дня и часа и верните объект

https://jsfiddle.net/Akshay_d/fndpq5y1/

Пожалуйста, дайте я знаю, как мне лучше понять сложные операции с массивами ... Спасибо

1 Ответ

0 голосов
/ 12 марта 2020

Итак, есть пара шагов к этому: вам нужно отсортировать массив, а затем отфильтровать массив.

Вы можете легко отсортировать его с помощью встроенной функции сортировки . Поскольку вы можете сравнивать строки, используя < и >, вам даже не нужны Moment.isSame, Moment.isBefore или Moment.isAfter для этого:

const array = [ ... ];
array.sort((item1, item2) => {
    const createdAt1 = item1.createdAt;
    const createdAt2 = item2.createdAt;

    if (createdAt1 < createdAt2) return 1;
    if (createdAt1 > createdAt2) return -1;
    return 0;
});

Теперь массив отсортировано по убыванию createdAt (последняя дата - первая). И поскольку он отсортирован, нам даже не нужно использовать Array.findIndex, чтобы увидеть, является ли что-то дубликатом. Мы знаем, что для любого элемента d с индексом i в массиве, если элемент с индексом i - 1 находится в тот же день, мы хотим сбросить d, потому что это не самая последняя запись за день.

const result = array.filter((d, i, a) => {
    // The first item we want to keep, and item -1 is undefined
    if (i === 0) return true;

    const d1 = moment(d.createdAt);
    const d2 = moment(a[i - 1].createdAt);

    return !d1.isSame(d2, 'day');
});
...