#javascript #arrays #filter
#javascript #массивы #Фильтр
Вопрос:
Привет, я хотел бы отфильтровать свои данные между диапазонами дат.
{
"websiteId": "4f8b36d00000000000000001",
"date": "2019-04-01T00:00:00.000Z",
"chats": 121,
"missedChats": 0
},
{
"websiteId": "4f8b36d00000000000000002",
"date": "2019-04-01T00:00:00.000Z",
"chats": 13,
"missedChats": 0
},
{
"websiteId": "4f8b36d00000000000000003",
"date": "2019-04-01T00:00:00.000Z",
"chats": 232,
"missedChats": 9
},
{
"websiteId": "4f8b36d00000000000000004",
"date": "2019-04-01T00:00:00.000Z",
"chats": 9,
"missedChats": 0
},
{
"websiteId": "4f8b36d00000000000000005",
"date": "2019-04-03T00:00:00.000Z",
"chats": 0,
"missedChats": 5
},
{
"websiteId": "4f8b36d00000000000000006",
"date": "2019-04-03T00:00:00.000Z",
"chats": 10,
"missedChats": 0
},
{
"websiteId": "4f8b36d00000000000000007",
"date": "2019-04-01T00:00:00.000Z",
"chats": 100,
"missedChats": 1
},
{
"websiteId": "4f8b36d00000000000000008",
"date": "2019-04-01T00:00:00.000Z",
"chats": 0,
"missedChats": 0
},
{
"websiteId": "4f8b36d00000000000000007",
"date": "2019-04-02T00:00:00.000Z",
"chats": 0,
"missedChats": 1
},
{
"websiteId": "4f8b36d00000000000000006",
"date": "2019-04-02T00:00:00.000Z",
"chats": 100,
"missedChats": 50
}
Моя текущая реализация
function getData(start, end) {
if (start == null amp;amp; end == null) {
fetch(url)
.then((res) => res.json())
.then((data) => {
console.log(
Object.values(
data.reduce((acc, el) => {
if (!(el.websiteId in acc)) {
acc[el.websiteId] = el;
} else {
acc[el.websiteId].chats = el.chats;
acc[el.websiteId].missedChats = el.missedChats;
}
return acc;
}, {})
)
);
});
} else {
var start = new Date('2019-04-01T00:00:00.000Z').getTime();
var end = new Date('2019-04-05T00:00:00.000Z').getTime();
result = data.filter((d) => {
var time = new Date(d.date).getTime();
return start < time amp;amp; time < end;
});
console.log(result);
}
}
Ожидаемый результат
когда я запускаю getData(дата начала (2019-4-01), дата окончания (2019-4-02)) Я должен иметь возможность получать данные между этими диапазонами дат
{
"websiteId": "4f8b36d00000000000000007",
"date": "2019-04-02T00:00:00.000Z",
"chats": 100,
"missedChats": 2
},
{
"websiteId": "4f8b36d00000000000000006",
"date": "2019-04-02T00:00:00.000Z",
"chats": 110,
"missedChats": 50
}
Я хотел бы получить данные между диапазоном дат при запуске функции getDate(StartDate, EndDate)
Комментарии:
1.
data.map(result => {})
не имеет никакого эффекта, поэтому не уверен, почему у вас это есть. Кроме того,data
вif
, кажется, происходит из вызова API, но вelse
, гдеdata
объявлено / назначено? Другими словами, ваши if и else выполняют совершенно разные и кажущиеся несвязанными вещи.2. извините, забыл удалить мою карту. отредактировал мой вопрос.
3. Ваша функция имеет
start
иend
в качестве параметров, но затем они повторно объявляются какconst
символы вelse
части. Параметры игнорируются.4. извините, я не видел эту часть. отредактировал мой вопрос
5. Ваши
start
иend
даты недопустимы: вам не хватает начала0
в дневной части даты. Кроме того,end
временная метка фактически предшествуетstart
временной метке: возможно, опечатка?
Ответ №1:
Вы должны переместить условие if в .then
блок:
const data = [{
"websiteId": "4f8b36d00000000000000001",
"date": "2019-04-01T00:00:00.000Z",
"chats": 121,
"missedChats": 0
},
{
"websiteId": "4f8b36d00000000000000002",
"date": "2019-04-01T00:00:00.000Z",
"chats": 13,
"missedChats": 0
},
{
"websiteId": "4f8b36d00000000000000003",
"date": "2019-04-01T00:00:00.000Z",
"chats": 232,
"missedChats": 9
},
{
"websiteId": "4f8b36d00000000000000004",
"date": "2019-04-01T00:00:00.000Z",
"chats": 9,
"missedChats": 0
},
{
"websiteId": "4f8b36d00000000000000005",
"date": "2019-04-03T00:00:00.000Z",
"chats": 0,
"missedChats": 5
},
{
"websiteId": "4f8b36d00000000000000006",
"date": "2019-04-03T00:00:00.000Z",
"chats": 10,
"missedChats": 0
},
{
"websiteId": "4f8b36d00000000000000007",
"date": "2019-04-01T00:00:00.000Z",
"chats": 100,
"missedChats": 1
},
{
"websiteId": "4f8b36d00000000000000008",
"date": "2019-04-01T00:00:00.000Z",
"chats": 0,
"missedChats": 0
},
{
"websiteId": "4f8b36d00000000000000007",
"date": "2019-04-02T00:00:00.000Z",
"chats": 0,
"missedChats": 1
},
{
"websiteId": "4f8b36d00000000000000006",
"date": "2019-04-02T00:00:00.000Z",
"chats": 100,
"missedChats": 50
}];
function getData(start, end) {
/*fetch(url)
.then((res) => res.json())
.then((data) => {*/
const summedData =
Object.values(
data.reduce((acc, el) => {
if (!(el.websiteId in acc)) {
acc[el.websiteId] = el;
} else {
acc[el.websiteId].chats = el.chats;
acc[el.websiteId].missedChats = el.missedChats;
}
return acc;
}, {}));
if (start amp;amp; end) {
result = summedData.filter((d) => {
const time = new Date(d.date).getTime();
return start < time amp;amp; time < end;
});
console.log(result);
} else {
console.log(summedData);
}
/*});*/
}
const start = new Date('2019-04-01T00:00:00.000Z').getTime();
const end = new Date('2019-04-05T00:00:00.000Z').getTime();
getData(start, end);
getData();
Комментарии:
1. @PinkyPromise Как вы можете видеть с помощью «Выполнить фрагмент кода», это работает. Это может означать, что выбранные и проанализированные данные отличаются от данных, которые вы опубликовали.
2. @PinkyPromise Я не могу помочь без дополнительной информации. Вы предоставили примерные данные, и с примерами данных это работает. Я не могу помочь с данными, которые вы не предоставили.
3. У вас есть два
console.log
оператора. Следовательно, у вас есть два вывода.4. @PinkyPromise Вы пытались нажать кнопку «Выполнить фрагмент кода»? Если мой код работает, а ваш код не работает, между нашими кодами есть различия. Не показывая мне ваш код, я не могу помочь. Я знаю только код и данные в вашем вопросе, и я создал рабочее решение с этой информацией.
5. @PinkyPromise Важно понимать разницу между Stackoverflow и форумом. Цель состоит не в том, чтобы помочь одному пользователю, а в создании базы знаний, подобной wiki, чтобы помочь многим пользователям.
Ответ №2:
Учитывая ваши данные, ваш filter
метод верен, вы должны преобразовать свои строки даты в a Date
и сравнить с getTime
.
const data = [{
"websiteId": "4f8b36d00000000000000001",
"date": "2019-04-01T00:00:00.000Z",
"chats": 121,
"missedChats": 0
}, {
"websiteId": "4f8b36d00000000000000002",
"date": "2019-04-01T00:00:00.000Z",
"chats": 13,
"missedChats": 0
}, {
"websiteId": "4f8b36d00000000000000003",
"date": "2019-04-01T00:00:00.000Z",
"chats": 232,
"missedChats": 9
}, {
"websiteId": "4f8b36d00000000000000004",
"date": "2019-04-01T00:00:00.000Z",
"chats": 9,
"missedChats": 0
}, {
"websiteId": "4f8b36d00000000000000005",
"date": "2019-04-03T00:00:00.000Z",
"chats": 0,
"missedChats": 5
}, {
"websiteId": "4f8b36d00000000000000006",
"date": "2019-04-03T00:00:00.000Z",
"chats": 10,
"missedChats": 0
}, {
"websiteId": "4f8b36d00000000000000007",
"date": "2019-04-01T00:00:00.000Z",
"chats": 100,
"missedChats": 1
}, {
"websiteId": "4f8b36d00000000000000008",
"date": "2019-04-01T00:00:00.000Z",
"chats": 0,
"missedChats": 0
}, {
"websiteId": "4f8b36d00000000000000007",
"date": "2019-04-02T00:00:00.000Z",
"chats": 0,
"missedChats": 1
}, {
"websiteId": "4f8b36d00000000000000006",
"date": "2019-04-02T00:00:00.000Z",
"chats": 100,
"missedChats": 50
}];
function getData(start, end) {
const startTime = new Date(start).getTime();
const endTime = new Date(end).getTime();
return data.filter(item => {
const itemTime = new Date(item.date).getTime();
return itemTime >= startTime amp;amp; itemTime <= endTime;
})
}
console.log(getData('2019-04-01', '2019-04-02'))
Комментарии:
1. должен ли я поместить его поверх моего Object.values? не могу заставить это работать.
2. Я начинаю, не определено.
3. Где? мой фрагмент кода доступен для выполнения, и он выполняется :]
4. в моем текущем коде я не могу это реализовать. по вопросу выше.