feat(scripts): buildGroupParents - BelongGroupID → group-X 父节点归类
This commit is contained in:
@@ -96,3 +96,44 @@ export function computeContentSize(spirit) {
|
||||
height: parseFloat(spirit.h || '0'),
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* 将 Spirit 记录按 BelongGroupID 归类, 生成 group-X 父节点集合 + Layer 根直挂子节点.
|
||||
*
|
||||
* 规则:
|
||||
* - BelongGroupID === '0' (或缺失) → 直挂 Layer 根, 不进任何 group 父节点
|
||||
* - BelongGroupID > 0 → 归入对应 group-<N> 父节点
|
||||
* - group 父节点按 ID 升序排列; 同 group 内子节点按 IndexOfLayer 升序
|
||||
* - 命名保留原 BelongGroupID 值, 不重排
|
||||
*
|
||||
* 数据源权威: IndexOfLayer 缺失视作 0 (XML 中该字段由 readLayerXml 提供, 必有值).
|
||||
*
|
||||
* @param {Array<{ id?: string, group?: string, indexOfLayer?: string }>} spirits
|
||||
* @returns {{ groupParents: Array<{ name: string, childSpiritIds: string[] }>, rootChildSpiritIds: string[] }}
|
||||
*/
|
||||
export function buildGroupParents(spirits) {
|
||||
const groupMap = new Map(); // group_id -> [{ spiritId, index }]
|
||||
const rootSpirits = [];
|
||||
|
||||
for (const s of spirits) {
|
||||
if (s.group === '0' || !s.group) {
|
||||
rootSpirits.push({ spiritId: s.id, index: parseInt(s.indexOfLayer || '0', 10) });
|
||||
} else {
|
||||
if (!groupMap.has(s.group)) groupMap.set(s.group, []);
|
||||
groupMap.get(s.group).push({ spiritId: s.id, index: parseInt(s.indexOfLayer || '0', 10) });
|
||||
}
|
||||
}
|
||||
|
||||
const groupParents = Array.from(groupMap.entries())
|
||||
.sort(([a], [b]) => parseInt(a, 10) - parseInt(b, 10))
|
||||
.map(([gid, items]) => ({
|
||||
name: `group-${gid}`,
|
||||
childSpiritIds: items.sort((a, b) => a.index - b.index).map(x => x.spiritId),
|
||||
}));
|
||||
|
||||
const rootChildSpiritIds = rootSpirits
|
||||
.sort((a, b) => a.index - b.index)
|
||||
.map(x => x.spiritId);
|
||||
|
||||
return { groupParents, rootChildSpiritIds };
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user