2024-08-02 18:19:39 +08:00

28 lines
832 B
JavaScript

import { Comment, Fragment, createTextVNode } from 'vue';
// o(n) flatten
export function flatten(vNodes, filterCommentNode = true, result = []) {
vNodes.forEach(vNode => {
if (vNode === null) return;
if (typeof vNode !== 'object') {
if (typeof vNode === 'string' || typeof vNode === 'number') {
result.push(createTextVNode(String(vNode)));
}
return;
}
if (Array.isArray(vNode)) {
flatten(vNode, filterCommentNode, result);
return;
}
if (vNode.type === Fragment) {
if (vNode.children === null) return;
if (Array.isArray(vNode.children)) {
flatten(vNode.children, filterCommentNode, result);
}
// rawSlot
} else {
if (vNode.type === Comment && filterCommentNode) return;
result.push(vNode);
}
});
return result;
}