Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 03.08.2022, 14:14
Аспирант
Отправить личное сообщение для dc65k Посмотреть профиль Найти все сообщения от dc65k
 
Регистрация: 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));
Ответить с цитированием
  #2 (permalink)  
Старый 03.08.2022, 14:34
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,238

Сообщение от dc65k
как более оптимально отфильтровать данные
Это не фильтр.

Ты хочешь узнать про первые "обращения" в каждом месяце?
Ответить с цитированием
  #3 (permalink)  
Старый 03.08.2022, 14:57
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,759

У тебя filtered возвращает объект, а в примере вывода ты рисуешь массив.
Чего надо то?
И по какому критерию оптимизировать?
По длине кода? По скорости выполнения?
Ответить с цитированием
  #4 (permalink)  
Старый 03.08.2022, 15:54
Аспирант
Отправить личное сообщение для dc65k Посмотреть профиль Найти все сообщения от dc65k
 
Регистрация: 19.05.2020
Сообщений: 46

"Ты хочешь узнать про первые обращения в каждом месяце?"

Да, верно.

Последний раз редактировалось dc65k, 03.08.2022 в 15:56.
Ответить с цитированием
  #5 (permalink)  
Старый 03.08.2022, 15:54
Аспирант
Отправить личное сообщение для dc65k Посмотреть профиль Найти все сообщения от dc65k
 
Регистрация: 19.05.2020
Сообщений: 46

Функция filtered возвращает массив.
Ответить с цитированием
  #6 (permalink)  
Старый 03.08.2022, 15:55
Аспирант
Отправить личное сообщение для dc65k Посмотреть профиль Найти все сообщения от dc65k
 
Регистрация: 19.05.2020
Сообщений: 46

Речь об оптимизации алгоритма.
Ответить с цитированием
  #7 (permalink)  
Старый 03.08.2022, 16:12
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 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.
Ответить с цитированием
  #8 (permalink)  
Старый 03.08.2022, 16:47
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 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));
Ответить с цитированием
  #9 (permalink)  
Старый 03.08.2022, 18:16
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 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.
Ответить с цитированием
  #10 (permalink)  
Старый 03.08.2022, 19:31
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,759

Сообщение от Alexandroppolus
Если в среднем M сообщений за месяц, то взяв k = sqrt(M)
В среднем M, но в каком то одном особенном 1 обращение. Как тогда k прибавлять?
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как вызвать свою функцию из «чужого» кода в Java Script, не переписывая «чужой» код? korobochkin Библиотеки/Тулкиты/Фреймворки 2 19.07.2014 16:17
Как вы относитесь к наркоманам? Maxmaxmaximus7 Оффтопик 7 05.02.2014 13:29
Расширение для Safari. Как вызвать функцию из popover в global page? housewm Opera, Safari и др. 0 21.12.2013 06:07
Flot Как передать переменную в функцию отрисовки точки на графике Ren jQuery 0 20.06.2012 14:16
как вызвать функцию название которой находиться в строке dark Общие вопросы Javascript 3 14.10.2009 13:02