ai-chatbot/lib/canvas/selection-order.ts

41 lines
960 B
TypeScript

export function orderItemsBySelectionIds<T>(
items: T[],
selectedIds: string[],
getItemId: (item: T) => string | null | undefined,
) {
const normalizedSelectedIds = Array.from(
new Set(
selectedIds
.map((id) => String(id || "").trim())
.filter(Boolean),
),
);
if (normalizedSelectedIds.length === 0) return items;
const itemById = new Map<string, T>();
for (const item of items) {
const id = String(getItemId(item) || "").trim();
if (id && !itemById.has(id)) {
itemById.set(id, item);
}
}
const orderedItems: T[] = [];
const orderedItemSet = new Set<T>();
for (const id of normalizedSelectedIds) {
const item = itemById.get(id);
if (item && !orderedItemSet.has(item)) {
orderedItems.push(item);
orderedItemSet.add(item);
}
}
for (const item of items) {
if (!orderedItemSet.has(item)) {
orderedItems.push(item);
}
}
return orderedItems;
}