@@ -91,7 +91,7 @@ function pause_effects(effects, controlled_anchor, callback) {
91
91
*/
92
92
export function each ( anchor , flags , get_collection , get_key , render_fn , fallback_fn = null ) {
93
93
/** @type {import('#client').EachState } */
94
- var state = { flags, next : null } ;
94
+ var state = { flags, items : new Map ( ) , next : null } ;
95
95
96
96
var is_controlled = ( flags & EACH_IS_CONTROLLED ) !== 0 ;
97
97
@@ -117,8 +117,6 @@ export function each(anchor, flags, get_collection, get_key, render_fn, fallback
117
117
? [ ]
118
118
: Array . from ( collection ) ;
119
119
120
- var keys = get_key === null ? array : array . map ( get_key ) ;
121
-
122
120
var length = array . length ;
123
121
124
122
// If we are working with an array that isn't proxied or frozen, then remove strict equality and ensure the items
@@ -171,7 +169,10 @@ export function each(anchor, flags, get_collection, get_key, render_fn, fallback
171
169
}
172
170
173
171
child_anchor = hydrate_anchor ( child_anchor ) ;
174
- item = create_item ( child_anchor , prev , null , array [ i ] , keys ?. [ i ] , i , render_fn , flags ) ;
172
+ var value = array [ i ] ;
173
+ var key = get_key ( value , i ) ;
174
+ item = create_item ( child_anchor , prev , null , value , key , i , render_fn , flags ) ;
175
+ state . items . set ( key , item ) ;
175
176
child_anchor = /** @type {Comment } */ ( child_anchor . nextSibling ) ;
176
177
177
178
prev = item ;
@@ -225,12 +226,10 @@ export function each(anchor, flags, get_collection, get_key, render_fn, fallback
225
226
function reconcile ( array , state , anchor , render_fn , flags , get_key ) {
226
227
var is_animated = ( flags & EACH_IS_ANIMATED ) !== 0 ;
227
228
229
+ var items = state . items ;
228
230
var first = state . next ;
229
231
var current = first ;
230
232
231
- /** @type {Map<any, import('#client').EachItem> } */
232
- var lookup = new Map ( ) ;
233
-
234
233
/** @type {Set<import('#client').EachItem> } */
235
234
var seen = new Set ( ) ;
236
235
@@ -255,18 +254,11 @@ function reconcile(array, state, anchor, render_fn, flags, get_key) {
255
254
/** @type {import('#client').EachItem | undefined } */
256
255
var item ;
257
256
258
- while ( current ) {
259
- lookup . set ( current . k , current ) ;
260
- current = current . next ;
261
- }
262
-
263
- current = first ;
264
-
265
257
if ( is_animated ) {
266
258
for ( let i = 0 ; i < array . length ; i += 1 ) {
267
259
value = array [ i ] ;
268
260
key = get_key ( value , i ) ;
269
- item = lookup . get ( key ) ;
261
+ item = items . get ( key ) ;
270
262
271
263
if ( item !== undefined ) {
272
264
item . a ?. measure ( ) ;
@@ -278,7 +270,7 @@ function reconcile(array, state, anchor, render_fn, flags, get_key) {
278
270
for ( let i = 0 ; i < array . length ; i += 1 ) {
279
271
value = array [ i ] ;
280
272
key = get_key ( value , i ) ;
281
- item = lookup . get ( key ) ;
273
+ item = items . get ( key ) ;
282
274
283
275
if ( item === undefined ) {
284
276
prev = create_item (
@@ -292,6 +284,8 @@ function reconcile(array, state, anchor, render_fn, flags, get_key) {
292
284
flags
293
285
) ;
294
286
287
+ items . set ( key , prev ) ;
288
+
295
289
matched = [ ] ;
296
290
stashed = [ ] ;
297
291
@@ -369,6 +363,7 @@ function reconcile(array, state, anchor, render_fn, flags, get_key) {
369
363
null ,
370
364
( ) => {
371
365
for ( const item of to_destroy ) {
366
+ items . delete ( item . k ) ;
372
367
link ( item . prev , item . next ) ;
373
368
}
374
369
}
0 commit comments