function mergeChildMappings(prev, next) {
prev = prev || {}
next = next || {}
function getValueForKey(key) {
return key in next ? next[key] : prev[key]
}
// For each key of `next`, the list of keys to insert before that key in
// the combined list
let nextKeysPending = Object.create(null)
let pendingKeys = []
// 遍历prev对象
for (let prevKey in prev) {
if (prevKey in next) { //如果prevKey在next中
if (pendingKeys.length) { //如果pendingKeys不为空,则将pendingKeys存入nextKeysPending[prevKey],并置pendingKeys为空
nextKeysPending[prevKey] = pendingKeys
pendingKeys = []
}
} else { //如果不在next中将其push到pendingKeys中
pendingKeys.push(prevKey)
}
}
// var prev = {"a":1,"b":2,"c":3,"d":4,"e":5,"f":6,"g":7,"h":8};
// var next = {"c":300,"d":400,"g":700};
// let nextKeysPending = Object.create(null)
//
// let pendingKeys = []
// // 遍历prev对象
// for (let prevKey in prev) {
// if (prevKey in next) { //如果prevKey在next中
// if (pendingKeys.length) { //如果pendingKeys不为空,则将pendingKeys存入nextKeysPending[prevKey],并置pendingKeys为空
// nextKeysPending[prevKey] = pendingKeys
// pendingKeys = []
// }
// } else { //如果不在next中将其push到pendingKeys中
// pendingKeys.push(prevKey)
// }
// }
// nextKeysPending = {
// c : ["a","b"],
// g : ["e","f"]
// }
// pendingKeys = ["h"]
let i
let childMapping = {}
for (let nextKey in next) {
if (nextKeysPending[nextKey]) {
for (i = 0; i < nextKeysPending[nextKey].length; i++) {
let pendingNextKey = nextKeysPending[nextKey][i]
// pendingNextKey存在于next,则取出存入childMapping[pendingNextKey]
childMapping[nextKeysPending[nextKey][i]] = getValueForKey(
pendingNextKey
)
}
}
//将例子中next.d的值赋值给合并之后的childMapping
childMapping[nextKey] = getValueForKey(nextKey)
}
// 最后将pendingKeys保存的值赋值给childMapping
// Finally, add the keys which didn't appear before any key in `next`
for (i = 0; i < pendingKeys.length; i++) {
childMapping[pendingKeys[i]] = getValueForKey(pendingKeys[i])
}
return childMapping
}
上面代码主要是将next合并到prev,为何会有如此复杂的逻辑,有什么其他考虑吗?
上面代码出自react官方推荐的动画库;