UNPKG

@antv/f2

Version:

Charts for mobile visualization.

93 lines 2.57 kB
import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2"; import { isArray, isNil } from '@antv/util'; function cloneElement(element, props) { if (!element) return element; return _objectSpread(_objectSpread({}, element), {}, { props: _objectSpread(_objectSpread({}, element.props), props) }); } function map(children, fn) { if (!children) { return fn(children); } if (isArray(children)) { return children.map(function (child) { return map(child, fn); }); } return fn(children); } function compareArray(nextElements, lastElements, callback) { var keyed = {}; var nextLength = nextElements.length; var lastLength = lastElements.length; for (var i = 0, len = lastLength; i < len; i++) { var element = lastElements[i]; if (element && !isNil(element.key)) { var key = element.key; keyed[key] = element; } } // 比较元素 for (var _i = 0, _len = Math.max(nextLength, lastLength); _i < _len; _i++) { var _element = nextElements[_i]; if (!_element) { compare(_element, lastElements[_i], callback); continue; } var _key = _element.key; // 有key值定义 if (!isNil(_element.key)) { var lastElement = keyed[_key]; if (lastElement) delete keyed[_key]; compare(_element, lastElement, callback); continue; } compare(_element, lastElements[_i], callback); } // 说明是删除的元素 Object.keys(keyed).forEach(function (key) { compare(null, keyed[key], callback); }); } // 比较2棵树 function compare(nextElement, lastElement, callback) { // 有一个为空 if (!nextElement || !lastElement) { callback(nextElement, lastElement); return; } if (isArray(nextElement) || isArray(lastElement)) { var nextElementArray = isArray(nextElement) ? nextElement : [nextElement]; var lastElementArray = isArray(lastElement) ? lastElement : [lastElement]; compareArray(nextElementArray, lastElementArray, callback); return; } callback(nextElement, lastElement); } function toArray(element) { if (!element) { return element; } if (!isArray(element)) { return [element]; } var newArray = []; for (var i = 0, len = element.length; i < len; i++) { var item = element[i]; if (isArray(item)) { // @ts-ignore newArray = newArray.concat(toArray(item)); } else { newArray.push(item); } } return newArray; } var Children = { cloneElement: cloneElement, map: map, toArray: toArray, compare: compare }; export default Children;