Skip to content

Commit 4f6d4aa

Browse files
authored
Merge pull request #389 from frejs/prefix-diff
diff算法回滚-预处理
2 parents 79dd1f8 + fdfa36f commit 4f6d4aa

File tree

1 file changed

+20
-12
lines changed

1 file changed

+20
-12
lines changed

src/reconcile.ts

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -179,35 +179,43 @@ const diff = (aCh, bCh) => {
179179
bTail = bCh.length - 1,
180180
aMap = null,
181181
bMap = null,
182-
key = (v) => v.key,
182+
same = (a, b) => a.key != null && b.key != null && a.key === b.key,
183183
temp = [],
184184
actions = []
185185

186186
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+
}
190194
aTail--
191195
bTail--
192196
}
193197

194198
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+
}
198206
aHead++
199207
bHead++
200208
}
201209
if (!aMap) {
202210
aMap = {}
203211
for (let i = aHead; i <= aTail; i++) {
204-
aMap[key(aCh[i])] = i
212+
aMap[aCh[i].key] = i
205213
}
206214
}
207215
if (!bMap) {
208216
bMap = {}
209217
for (let i = bHead; i <= bTail; i++) {
210-
bMap[key(bCh[i])] = i
218+
bMap[bCh[i].key] = i
211219
}
212220
}
213221
while (aHead !== aTail + 1 || bHead !== bTail + 1) {
@@ -221,7 +229,7 @@ const diff = (aCh, bCh) => {
221229
} else if (aTail + 1 <= aHead) {
222230
actions.push({ op: TAG.INSERT, cur: bElm, ref: aElm })
223231
bHead++
224-
} else if (key(aElm) === key(bElm)) {
232+
} else if (aElm.key === bElm.key) {
225233
if (aElm.type === bElm.type) {
226234
clone(aElm, bElm)
227235
actions.push({ op: TAG.UPDATE })
@@ -231,8 +239,8 @@ const diff = (aCh, bCh) => {
231239
aHead++
232240
bHead++
233241
} 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]
236244
if (foundB === undefined) {
237245
removeElement(aElm)
238246
aHead++

0 commit comments

Comments
 (0)