2016-11-22 2 views
8

私は今月のすべてのイベントを含む2つのループを毎月毎に1つずつ持っています。 100,000のイベントがあるとしましょう。 イベントがメインイベント「List」から「消滅しました」から削除する方法を探しています。immutable.js検索されたエントリをフィルタ処理して変更(削除)

immutablejsと同じ最適化を達成するためにどのように
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) 
} 

:私はちょうどのような何かを行うことができlodashで

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}]) 
} 

コードのようなものでしょうか?私は本当に、リストを反復処理する私の方法のためのソリューションを期待していないんだけど、イベントはビンに分割して、それがますます小さく得る方法でイベントListを削減するスマートな方法..ため

答えて

4

あなたがMapを試すことができます - あなたの例に基づいて、あなたは日付に基づいてビンを探します - ビンを検索し、バッチとして処理し、それを削除しますO(1)。不変のマップはかなり安価であり、リストを反復するよりはるかに良いです。あなたは一度のビニングのコストを負担することができますが、O(1)ルックアップでそれを償却します。

おそらくこのような何か:あなたがより速く何かをするつもりされていない処理済みの要素をremobingことで

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) 
+0

ところで、私はアプローチはゼロ副作用と末尾再帰を用いた機能的に純粋である、追加すべきです。残りのアイテムを言いたい場合は、単にiterから値を返すことができます。 – Asti

1

。すべてのフィルタ操作のコストは平均して半分になりますが、すべての反復で新しいリストを作成するにはCPUのコストがかかりますので、大幅に高速になることはありません(大きな意味で)。代わりに、initialDate-sに基づく不変のマップなどのインデックスを作成して、すべてのfilterコールを不要にすることができます。

const calendarRange = Immutable.Range(0, 10, 2).map(i => Immutable.fromJS({initialDate: i})); 
 

 
const events = Immutable.Range(0, 20).map(i => Immutable.fromJS({initialDate: i%10, i:i})); 
 

 

 
const index = events.groupBy(event => event.get('initialDate')); 
 

 
calendarRange.forEach(day => { 
 
    const dayEvents = index.get(day.get('initialDate')); 
 
    doSomeThingWithDays(dayEvents); 
 
}); 
 

 
function doSomeThingWithDays(data) { 
 
    console.log(data); 
 
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/immutable/3.8.1/immutable.js"></script>

関連する問題