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它变得越来越小..
您可以尝试将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)