33 lines
1.0 KiB
JavaScript
33 lines
1.0 KiB
JavaScript
function orderUnits(titles, groups) {
|
|
const byCode = new Map(titles.filter((title) => title.Code).map((title) => [title.Code, title]));
|
|
const state = new Map(),
|
|
ordered = [];
|
|
for (const title of titles) {
|
|
if (!title.Code || state.has(title.Code)) continue;
|
|
const stack = [{ title, expanded: false }];
|
|
while (stack.length) {
|
|
const item = stack.pop(),
|
|
code = item.title.Code;
|
|
if (item.expanded) {
|
|
state.set(code, 2);
|
|
ordered.push(item.title);
|
|
continue;
|
|
}
|
|
if (state.has(code)) continue;
|
|
state.set(code, 1);
|
|
stack.push({ title: item.title, expanded: true });
|
|
for (const row of groups.get(code) || []) {
|
|
const dependency =
|
|
!(row.JdlSummary && Number(row.CalcIndex) === 1) &&
|
|
Number(row.LinkIndex) === 103 &&
|
|
byCode.get(row.Code);
|
|
if (dependency && !state.has(dependency.Code))
|
|
stack.push({ title: dependency, expanded: false });
|
|
}
|
|
}
|
|
}
|
|
return ordered;
|
|
}
|
|
|
|
module.exports = { orderUnits };
|