UNPKG

@fanx/wxstore

Version:

wechat miniprogram store manager

46 lines (45 loc) 1.5 kB
import { type, OBJECT, ARRAY } from './utils' /** * diff * @param {*} current 当前数据 * @param {*} pre 原数据 * @param {*} prefix diff key 前缀 * @param {*} performance 是否开始数组performance模式,开始后可对push类型数组diff优化,若非push改变的数组可能会出现数据错误 */ export default function diff (current, pre, prefix = '', performance) { const diffObj = {} if (type(pre, ARRAY) && type(current, ARRAY)) { if (current.length < pre.length) { // 数据length比原数据小,全替换 diffObj[prefix] = current } else { // 数据length比原数据大 if (!performance) { // 非性能模式下数组每一项深层diff for (let i = 0; i < pre.length; i++) { Object.assign(diffObj, diff(current[i], pre[i], `${prefix ? `${prefix}[${i}]` : `[${i}]`}`, performance)) } } if (current.length > pre.length) { // 性能模式下数组push for (let i = pre.length; i < current.length; i++) { diffObj[`${prefix}[${i}]`] = current[i] } } } } else if (type(pre, OBJECT) && type(current, OBJECT)) { // 对象 const keys = Object.keys(current) keys.forEach((key) => { Object.assign(diffObj, diff(current[key], pre[key], `${prefix ? `${prefix}.${key}` : key}`, performance)) }) } else if (prefix && current !== pre) { // 非数组非对象 diffObj[prefix] = current } return diffObj }