immutable.js过滤和mutate(删除)找到的条目

ena*_*upe 9 javascript optimization logic immutable.js

我有两个循环,一个月的每一天,另一个与本月的所有事件.假设我有10万个事件.我正在寻找一种方法,List一旦它们被"消耗",就从主要事件中删除事件.

代码类似于:

const calendarRange = [{initialDate}, {initialDate}, {initialDate}, {initialDate}, ...] // say we have 30 dates, one for each day
const events = fromJS([{initialDate}, {initialDate}, {initialDate}, ...]) // let's say we have 100 000
calendarRange.map((day) => {
  const dayEvents = events.filter((event) => day.get('initialDate').isSame(event.get('initialDate'), 'day')) // we get all events for each day 
  doSomeThingWithDays(dayEvents)
  // how could I subtract `dayEvents` from `events` in a way
  // the next celandarRange iteration we have less events to filter? 
  // the order of the first loop must be preserved (because it's from day 1 to day 3{01}])
}
Run Code Online (Sandbox Code Playgroud)

用lodash,我可以做一些像:

calendarRange.map((day) => {
  const dayEvents = events.filter((event) => day.get('initialDate').isSame(event.get('initialDate'), 'day')) // we get all events for each day 
  doSomeThingWithDays(dayEvents)
  pullAllWith(events, dayEvents, (a, b) => a === b)
}
Run Code Online (Sandbox Code Playgroud)

如何使用immutablejs完成相同的优化?我并不是真的希望我的迭代列表的解决方案,但是以一种减少事件的智能方式,List它变得越来越小..

Ast*_*sti 4

您可以尝试将Map事件拆分为垃圾箱 - 根据您的示例,您基于日期进行垃圾箱 - 您可以查找垃圾箱,将其作为批处理并将其删除 O(1)。不可变映射相当便宜,并且比迭代列表要好得多。您可能会产生一次性分箱的成本,但可以通过 O(1) 查找将其分摊。

也许是这样的:

eventbins = OrderedMap(events.groupBy(evt => evt.get('initialDate').dayOfYear() /* or whatever selector */)) 

function iter(list, bins) { 
 if(list.isEmpty()) 
   return
 day = list.first()
 dayEvents = bins.get(day.dayOfYear())
 doSomeThingWithDays(dayEvents)
 iter(list.shift(), bins.delete(day))
}

iter(rangeOfDays, eventbins)
Run Code Online (Sandbox Code Playgroud)