@@ -179,35 +179,43 @@ const diff = (aCh, bCh) => {
179
179
bTail = bCh . length - 1 ,
180
180
aMap = null ,
181
181
bMap = null ,
182
- key = ( v ) => v . key ,
182
+ same = ( a , b ) => a . key != null && b . key != null && a . key === b . key ,
183
183
temp = [ ] ,
184
184
actions = [ ]
185
185
186
186
while ( aHead <= aTail && bHead <= bTail ) {
187
- if ( key ( aCh [ aTail ] ) !== key ( bCh [ bTail ] ) ) break
188
- clone ( aCh [ aTail ] , bCh [ bTail ] )
189
- temp . push ( { op : TAG . UPDATE } )
187
+ if ( ! same ( aCh [ aTail ] , bCh [ bTail ] ) ) break
188
+ if ( aCh [ aTail ] . type === bCh [ bTail ] . type ) {
189
+ clone ( aCh [ aTail ] , bCh [ bTail ] )
190
+ temp . push ( { op : TAG . UPDATE } )
191
+ } else {
192
+ actions . push ( { op : TAG . REPLACE , cur : bCh [ bTail ] , ref : aCh [ aTail ] } )
193
+ }
190
194
aTail --
191
195
bTail --
192
196
}
193
197
194
198
while ( aHead <= aTail && bHead <= bTail ) {
195
- if ( key ( aCh [ aHead ] ) !== key ( bCh [ bHead ] ) ) break
196
- clone ( aCh [ aHead ] , bCh [ bHead ] )
197
- actions . push ( { op : TAG . UPDATE } )
199
+ if ( ! same ( aCh [ aHead ] , bCh [ bHead ] ) ) break
200
+ if ( aCh [ aHead ] . type === bCh [ bHead ] . type ) {
201
+ clone ( aCh [ aHead ] , bCh [ bHead ] )
202
+ actions . push ( { op : TAG . UPDATE } )
203
+ } else {
204
+ actions . push ( { op : TAG . REPLACE , cur : bCh [ bHead ] , ref : aCh [ aHead ] } )
205
+ }
198
206
aHead ++
199
207
bHead ++
200
208
}
201
209
if ( ! aMap ) {
202
210
aMap = { }
203
211
for ( let i = aHead ; i <= aTail ; i ++ ) {
204
- aMap [ key ( aCh [ i ] ) ] = i
212
+ aMap [ aCh [ i ] . key ] = i
205
213
}
206
214
}
207
215
if ( ! bMap ) {
208
216
bMap = { }
209
217
for ( let i = bHead ; i <= bTail ; i ++ ) {
210
- bMap [ key ( bCh [ i ] ) ] = i
218
+ bMap [ bCh [ i ] . key ] = i
211
219
}
212
220
}
213
221
while ( aHead !== aTail + 1 || bHead !== bTail + 1 ) {
@@ -221,7 +229,7 @@ const diff = (aCh, bCh) => {
221
229
} else if ( aTail + 1 <= aHead ) {
222
230
actions . push ( { op : TAG . INSERT , cur : bElm , ref : aElm } )
223
231
bHead ++
224
- } else if ( key ( aElm ) === key ( bElm ) ) {
232
+ } else if ( aElm . key === bElm . key ) {
225
233
if ( aElm . type === bElm . type ) {
226
234
clone ( aElm , bElm )
227
235
actions . push ( { op : TAG . UPDATE } )
@@ -231,8 +239,8 @@ const diff = (aCh, bCh) => {
231
239
aHead ++
232
240
bHead ++
233
241
} else {
234
- var foundB = bMap [ key ( aElm ) ]
235
- var foundA = aMap [ key ( bElm ) ]
242
+ var foundB = bMap [ aElm . key ]
243
+ var foundA = aMap [ bElm . key ]
236
244
if ( foundB === undefined ) {
237
245
removeElement ( aElm )
238
246
aHead ++
0 commit comments