behavior-eden-coco-plugin/dist/runtime/core/utils.js
2023-09-21 01:32:33 +08:00

121 lines
3.2 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.deepClone = exports.preOrder = exports.bfsCcNode = exports.buildTree = exports.postOrder = void 0;
/***
* N叉树的倒序遍历
*/
const postOrder = function (root) {
if (!root) {
return [];
}
const stack = [root];
const stack2 = [];
const result = [];
while (stack.length) {
const node = stack.pop();
stack2.push(node);
for (let i = 0; i < node.children.length; i++) {
stack.push(node.children[i]);
}
}
while (stack2.length) {
result.push(stack2.pop());
}
return result;
};
exports.postOrder = postOrder;
/**
* 数组转树,返回根节点
* @param nodes
* @returns root
*/
const buildTree = (_nodes) => {
// 防止修改有原数据
const nodes = (0, exports.deepClone)(_nodes);
const nodeMap = new Map();
let root = null;
// 记录id和node数据的映射
for (const node of nodes) {
if (node.isRoot) {
root = node;
}
nodeMap.set(node.id, node);
}
// 没有根节点
if (!root) {
return null;
}
// 把children中的Id换成真正的node数据
for (const node of nodes) {
node.children = node.children.map((childId) => nodeMap.get(childId));
}
// 返回根节点
return root;
};
exports.buildTree = buildTree;
/***
* BFS开始
* 从当前节点开始层序遍历
* 找不到再从scene节点开始层序遍历
* dirtyNode代表需要跳过的节点避免scene场景重复遍历curNode
*/
const bfsCcNode = (root, targetUuid, dirtyUuid) => {
let target = null;
let queue = [root];
// 给while循环起名
myWhile: while (queue.length) {
const len = queue.length;
for (let i = 0; i < len; i++) {
const item = queue.pop();
const uuid = item.uuid;
if (uuid === targetUuid) {
target = item;
// 找到目标直接退出while循环
break myWhile;
}
for (let j = 0; j < item.children.length; j++) {
const child = item.children[j];
// 跳过已经遍历过的节点
if (dirtyUuid && child.uuid === dirtyUuid) {
continue;
}
queue.unshift(child);
}
}
}
return target;
};
exports.bfsCcNode = bfsCcNode;
const preOrder = function (root) {
if (!root) {
return [];
}
var stack = [root];
var result = [];
while (stack.length) {
const item = stack.pop();
for (let i = item.children.length - 1; i >= 0; i--) {
stack.push(item.children[i]);
}
result.push(item);
}
return result;
};
exports.preOrder = preOrder;
/***
* 深克隆
*/
const deepClone = (obj) => {
if (typeof obj !== "object" || obj === null) {
return obj;
}
const res = Array.isArray(obj) ? [] : {};
for (const key in obj) {
if (Object.prototype.hasOwnProperty.call(obj, key)) {
res[key] = (0, exports.deepClone)(obj[key]);
}
}
return res;
};
exports.deepClone = deepClone;