我有两个循环,一个用于每个月的每一天,另一个用于本月的所有事件。假设我有 100 000 个事件。
我正在寻找一种方法来从主要事件 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}])
}
使用 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)
}
如何用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)
关于javascript - immutable.js 过滤和变异(删除)找到的条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40748370/