javascript - Verileri en son tarihe göre nasıl filtreler/azaltırsınız


data = {
 start: 1,
 data: [
  {
   name: 'Juan',
   date: '2020-01-19
  },
  {
   name: 'Carlo',
   date: '2020-03-01
  },
  {
   name: 'Dela',
   date: '2020-03-01
  },
  {
   name: 'Cruz',
   date: '2021-04-01
  }
 ],
 totalRecords: 19
}

Yapmaya çalıştığım şey, verileri en son tarihe yani 2020-04-01 tarihine göre filtrelemek.

Denediğim şey şunun gibi:

response['data']['data'] = response['data']['data'].filter(item => {
           return item['date'] > '2020-04-01';
         });

Ama işe yaramıyor.

Beklenen çıktı böyle olmalıdır

data = {
 start: 1,
 data: [
  {
   name: 'Cruz',
   date: '2021-04-01
  }
 ],
 totalRecords: 19
}

Cevap #1

sort kullanabilir ve ardından en son tarihe sahip öğeyi almak için dizideki ilk girdiyi alabilirsiniz.

data.data.sort((a, b) => new Date(b.date) - new Date(a.date))[0];

Cevap #2

Bazı problemler için başka cevaplar mevcuttur (performans ve beklenen çıktı açısından).

  1. time complexity en az O(nlogn) süreceği için sort kullanmamalısınız.
  2. filter kullanmak birden fazla lastItem döndürecektir

==> Böylece Array#reduce'ü (zaman karmaşıklığı sadece O(n)) şöyle kullanabilirsiniz.

const comparedDate = new Date('2020-04-01')
const response = {
 start: 1,
 data:[{name:'Juan',date:'2020-01-19'},{name:'Carlo',date:'2020-03-01'},{name:'Dela',date:'2020-03-01'},{name:'Cruz',date:'2021-04-01'}],
 totalRecords:19};

const lastData = response.data.reduce((acc, curr) => {
  if(new Date(curr.date) > comparedDate)
    acc = curr;
  
  return acc;
}, response.data[0]);

console.log(lastData);

Birden fazla öğe <= 2020-04-01 ile sonuçlanmasını istiyorsanız, bunu şöyle yapabilirsiniz

const comparedDate = new Date('2020-04-01')
const response = {
 start: 1,
 data:[{name:'Juan',date:'2020-01-19'},{name:'Carlo',date:'2020-03-01'},{name:'Dela',date:'2020-03-01'},{name:'Cruz',date:'2021-04-01'}],
 totalRecords:19};

response.data = response.data.reduce((acc, curr) => {
  if(new Date(curr.date) >= comparedDate)
    acc.push(curr);
  
  return acc;
}, []);
console.log(response);