javascript - immutable.js 过滤和变异(删除)找到的条目

标签 javascript optimization logic immutable.js

我有两个循环,一个用于每个月的每一天,另一个用于本月的所有事件。假设我有 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/

相关文章:

Javascript点击某个div下的按钮功能

android - zipalign 不会改变 apk 文件

.net - 如何将 .NET 应用程序优化为 64 位?

javascript - 函数通过调用自身来复制 JavaScript 中的对象,需要帮助理解逻辑

logic - Z3定理证明者 : Pythagorean Theorem (Non-Linear Artithmetic)

javascript - 转换数组的数组,并返回一个对象,数组中的每对元素作为键值对

c# - 如何将对象参数传递给 WCF 服务?

javascript - Fluxxor/React.JS 中的服务调用

sql - 在 MySQL 中使用集合的更快方法

Python while (bool) :