41 lines
960 B
TypeScript
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;
|
|
}
|