发现 j > prevEnd 并且 j <= nextEnd,这说明当新旧 children 中相同的前缀和后缀被更新之后,旧 children 中的节点已经被更新完毕了,而新 children 中仍然有剩余节点,通过上图可以发现,新 children 中的 li-d 节点,就是这个剩余的节点。实际上新 children 中位于 j 到 nextEnd 之间的所有节点都应该是新插入的节点:
const prevStart = j
const nextStart = j
let moved =falselet pos =0// 构建索引表const keyIndex ={}for(let i = nextStart; i <= nextEnd; i++){keyIndex[nextChildren[i].key]= i
}// 遍历旧 children 的剩余未处理节点for(let i = prevStart; i <= prevEnd; i++){prevVNode = prevChildren[i]// 通过索引表快速找到新 children 中具有相同 key 的节点的位置const k = keyIndex[prevVNode.key]if(typeof k !=='undefined'){nextVNode = nextChildren[k]// patch 更新patch(prevVNode, nextVNode, container)// 更新 source 数组source[k - nextStart]= i// 判断是否需要移动if(k < pos){moved =true}else{pos = k}}else{// 没找到}}
删除节点
删除未查找到的节点
拿旧 children 中的节点尝试去新 children 中寻找具有相同 key 值的节点,但并非总是能够找得到,当 k === ‘undefined’ 时,说明该节点在新 children 中已经不存在了,这时我们应该将其移除
// 遍历旧 children 的剩余未处理节点for(let i = prevStart; i <= prevEnd; i++){prevVNode = prevChildren[i]// 通过索引表快速找到新 children 中具有相同 key 的节点的位置const k = keyIndex[prevVNode.key]if(typeof k !=='undefined'){// 省略...}else{// 没找到,说明旧节点在新 children 中已经不存在了,应该移除container.removeChild(prevVNode.el)}}
删除多余节点
旧 children 中已经更新过的节点数量应该小于新 children 中需要更新的节点数量,一旦更新过的节点数量超过了新 children 中需要更新的节点数量,则说明该节点是多余的节点,我们也应该将其移除
const nextLeft = nextEnd - j +1// 新 children 中剩余未处理节点的数量let patched =0// 遍历旧 children 的剩余未处理节点for(let i = prevStart; i <= prevEnd; i++){prevVNode = prevChildren[i]if(patched < nextLeft){// 通过索引表快速找到新 children 中具有相同 key 的节点的位置const k = keyIndex[prevVNode.key]if(typeof k !=='undefined'){nextVNode = nextChildren[k]// patch 更新patch(prevVNode, nextVNode, container)patched++// 更新 source 数组source[k - nextStart]= i// 判断是否需要移动if(k < pos){moved =true}else{pos = k}}else{// 没找到,说明旧节点在新 children 中已经不存在了,应该移除container.removeChild(prevVNode.el)}}else{// 多余的节点,应该移除container.removeChild(prevVNode.el)}}
导读:
什么是Spring Data JPA? 要解释这个问题,我们先将Spring Data JPA拆成两个部分,即Sping Data和JPA。 从这两个部分来解释。 Spring Data是什么? 摘自: https://spring.io/projects/spring-data
Spring Data’s mission is to provide a familiar and cons…
A.Tales of a Sort
题目大意
Alphen has an array of positive integers a a a of length n.
Alphen can perform the following operation:
For all i i i from 1 to n, replace a i a_i ai with max ( 0 , a i − 1 ) \max(0,a_i−1) max(0,ai−1) .
Alphen …
目录 一、list的介绍及使用
1.1 list的介绍 1.2 list的使用
1.2.1 list的构造 1.2.2 list iterator的使用
1.2.3 list capacity
1.2.4 list element access
1.2.5 list modifiers
1.2.6 list 迭代器失效
二、list的模拟实现
2.1 模拟实现list
三、list和vector的对比…