
03.08.2022, 14:14
|
Аспирант
|
|
Регистрация: 19.05.2020
Сообщений: 46
|
|
Как оптимизировать функцию фильтрации?
Всем привет, подскажите, как более оптимально отфильтровать данные:
const data = [
{
"date": "2020-03-02",
"value": "-0.00807736"
},
{
"date": "2020-03-03",
"value": "0.01775831"
},
{
"date": "2020-03-04",
"value": "0.00433390"
},
{
"date": "2020-03-31",
"value": "0.02667099"
},
{
"date": "2020-04-01",
"value": "-0.01370213"
},
{
"date": "2020-04-02",
"value": "0.02922457"
},
{
"date": "2020-04-03",
"value": "0.01015846"
},
{
"date": "2020-04-06",
"value": "0.01984755"
},
{
"date": "2020-04-07",
"value": "0.00296561"
},
{
"date": "2020-04-08",
"value": "0.01393626"
},
{
"date": "2020-04-09",
"value": "0.01132951"
},
{
"date": "2020-04-10",
"value": "-0.00822985"
},
{
"date": "2020-04-13",
"value": "-0.01640604"
},
{
"date": "2020-05-04",
"value": "-0.00000651"
},
{
"date": "2020-05-05",
"value": "-0.00000513"
},
{
"date": "2020-05-06",
"value": "-0.00501929"
},
{
"date": "2020-05-07",
"value": "0.00339571"
},
{
"date": "2020-05-08",
"value": "0.00176003"
}
]
/*
output
[
2020-03-02,
2020-04-01,
2020-05-04,
]
*/
const filtered = (data) => Object.values(data.reduceRight((accumulator, currentValue) => {
accumulator[new Date(currentValue.date).getMonth()] = currentValue.date
return accumulator
}, {}))
console.log(filtered(data));
|
|

03.08.2022, 14:34
|
 |
CacheVar
|
|
Регистрация: 19.08.2010
Сообщений: 14,238
|
|
Сообщение от dc65k
|
как более оптимально отфильтровать данные
|
Это не фильтр.
Ты хочешь узнать про первые "обращения" в каждом месяце?
|
|

03.08.2022, 14:57
|
 |
Профессор
|
|
Регистрация: 03.02.2020
Сообщений: 2,759
|
|
У тебя filtered возвращает объект, а в примере вывода ты рисуешь массив.
Чего надо то?
И по какому критерию оптимизировать?
По длине кода? По скорости выполнения?
|
|

03.08.2022, 15:54
|
Аспирант
|
|
Регистрация: 19.05.2020
Сообщений: 46
|
|
"Ты хочешь узнать про первые обращения в каждом месяце?"
Да, верно.
Последний раз редактировалось dc65k, 03.08.2022 в 15:56.
|
|

03.08.2022, 15:54
|
Аспирант
|
|
Регистрация: 19.05.2020
Сообщений: 46
|
|
Функция filtered возвращает массив.
|
|

03.08.2022, 15:55
|
Аспирант
|
|
Регистрация: 19.05.2020
Сообщений: 46
|
|
Речь об оптимизации алгоритма.
|
|

03.08.2022, 16:12
|
 |
Тлен
|
|
Регистрация: 02.01.2010
Сообщений: 6,590
|
|
Если даты уже отсортированы и формат закреплён, и если уж совсем оптимизировать, то наверное как-то так:
const filter = (data) => {
if (!data || !data.length) return [];
const firstDate = data[0].date;
const result = [ firstDate ];
let lastMonth = firstDate.slice(5, 7);
for (let i = 1; i < data.length; i++) {
const { date } = data[i];
const month = date.slice(5, 7);
if (month > lastMonth) {
lastMonth = month;
result.push(date);
}
}
return result;
}
__________________
29375, 35
Последний раз редактировалось Aetae, 03.08.2022 в 16:15.
|
|

03.08.2022, 16:47
|
 |
CacheVar
|
|
Регистрация: 19.08.2010
Сообщений: 14,238
|
|
Предложу такой вариант...
const data = [
{
"date": "2020-03-02",
"value": "-0.00807736"
},
{
"date": "2020-03-03",
"value": "0.01775831"
},
{
"date": "2020-03-04",
"value": "0.00433390"
},
{
"date": "2020-03-31",
"value": "0.02667099"
},
{
"date": "2020-04-01",
"value": "-0.01370213"
},
{
"date": "2020-04-02",
"value": "0.02922457"
},
{
"date": "2020-04-03",
"value": "0.01015846"
},
{
"date": "2020-04-06",
"value": "0.01984755"
},
{
"date": "2020-04-07",
"value": "0.00296561"
},
{
"date": "2020-04-08",
"value": "0.01393626"
},
{
"date": "2020-04-09",
"value": "0.01132951"
},
{
"date": "2020-04-10",
"value": "-0.00822985"
},
{
"date": "2020-04-13",
"value": "-0.01640604"
},
{
"date": "2020-05-04",
"value": "-0.00000651"
},
{
"date": "2020-05-05",
"value": "-0.00000513"
},
{
"date": "2020-05-06",
"value": "-0.00501929"
},
{
"date": "2020-05-07",
"value": "0.00339571"
},
{
"date": "2020-05-08",
"value": "0.00176003"
}
]
/*
output
[
2020-03-02,
2020-04-01,
2020-05-04,
]
*/
const filtered = data => {
const o = {}
for (let i = 0; i < data.length; i++) {
const m = data[i].date.slice(0, 7)
if (o[m]) continue
o[m] = data[i].date
}
return Object.values(o)
}
alert(filtered(data));
|
|

03.08.2022, 18:16
|
 |
Профессор
|
|
Регистрация: 25.10.2016
Сообщений: 1,012
|
|
Сообщение от Aetae
|
Если даты уже отсортированы
|
тогда можно ещё прикинуть, сколько примерно записей бывает за месяц, и в цикле прибавлять не i++, а i += k. Если набижали на новый месяц, то ищем начало нового месяца, идя от прошлой записи и прибавляя 1 (или идя назад).
Если в среднем M сообщений за месяц, то взяв k = sqrt(M), получим O(N / sqrt(M)) вместо (O(N))
при маленьких М, конечно, толку от этого не будет.. Хотя надо заметить, что при малых M и записей всего очень мало (потому как за 100 лет было всего 1200 месяцев, и оптимизировать нечего). Т.е. М, судя по всему, здоровенное.
Последний раз редактировалось Alexandroppolus, 03.08.2022 в 18:23.
|
|

03.08.2022, 19:31
|
 |
Профессор
|
|
Регистрация: 03.02.2020
Сообщений: 2,759
|
|
Сообщение от Alexandroppolus
|
Если в среднем M сообщений за месяц, то взяв k = sqrt(M)
|
В среднем M, но в каком то одном особенном 1 обращение. Как тогда k прибавлять?
|
|
|
|