Вы можете использовать reduce
по-разному:
1] В массиве accumulator
проверьте, существует ли объект с такой же датой, как у dt_txt
.Если да, пропустите элемент, иначе добавьте элемент в accumulator
const list = [{"dt": 1545760800,"dt_txt": "2018-12-25 18:00:00"},{"dt": 1545771600,"dt_txt": "2018-12-25 21:00:00"},{"dt": 1545782400,"dt_txt": "2018-12-26 00:00:00"},{"dt": 1545782400,"dt_txt": "2018-12-26 03:00:00"},{"dt": 1545782400,"dt_txt": "2018-12-26 04:00:00"}]
const filter1 = list.reduce((acc, i) => (
acc.find(a => new Date(a.dt_txt).toDateString() === new Date(i.dt_txt).toDateString())
? ''
: acc.push(i), acc),
[]);
console.log(filter1);
2] Во втором подходе создается отдельная функция compareDates
для сравнения дат и возврата boolean
.Я использую toDateString () для сравнения дат
const list = [{"dt": 1545760800,"dt_txt": "2018-12-25 18:00:00"},{"dt": 1545771600,"dt_txt": "2018-12-25 21:00:00"},{"dt": 1545782400,"dt_txt": "2018-12-26 00:00:00"},{"dt": 1545782400,"dt_txt": "2018-12-26 03:00:00"},{"dt": 1545782400,"dt_txt": "2018-12-26 04:00:00"}]
// create a seperate function to compare the dates a return a boolean
const compareDates = (d1, d2) => new Date(d1).toDateString() === new Date(d2).toDateString();
const filter2 = list.reduce((acc, i) => (
acc.find(a => compareDates(a.dt_txt, i.dt_txt)) ? '' : acc.push(i), acc)
,[])
console.log(filter2);
3] В третьем подходе целью является создание объекта с уникальными значениями даты в качестве ключа.Для каждого элемента в исходном массиве проверьте, существует ли эта дата в качестве ключа в accumulator
.Если да, пропустите текущий элемент в контексте, иначе добавьте текущий элемент в качестве его значения.В конце у вас есть пара ключ-значение различных объектов в оригинальном массиве.Итак, просто получите значения, используя Object.values
const list =[{"dt": 1545760800,"dt_txt": "2018-12-25 18:00:00"},{"dt": 1545771600,"dt_txt": "2018-12-25 21:00:00"},{"dt": 1545782400,"dt_txt": "2018-12-26 00:00:00"},{"dt": 1545782400,"dt_txt": "2018-12-26 03:00:00"},{"dt": 1545782400,"dt_txt": "2018-12-26 04:00:00"}];
// gets only the date part in string
const getDateString = (date) => new Date(date).toDateString();
const filter3 = Object.values(
list.reduce((acc, i) =>
(acc[getDateString(i.dt_txt)] = acc[getDateString(i.dt_txt)] || i, acc),{}))
console.log(filter3);