Перебор списка - это медленно (сложность O(n)). Так что вполне логично для больших наборов данных создавать индексы. В вашем конкретном случае можно использовать Map (сложность доступа - O(1)).
Реализовать можно по-разному. Например, хранить набор посетителей (VisitorService.visitors$) не как список, а как объект класса, умеющего эффективно в этом наборе искать.
Что-то вроде такого:
class VisitorCollection {
private readonly _byDocumentNumber = new Map<string, IVisitor>();
private readonly _byCode = new Map<string, IVisitor>();
constructor(readonly list: readonly IVisitor[]) {
// Fill the indices
for (const visitor of list) {
const { code, document_number } = visitor;
if (code) {
this._byCode.set(code.toLowerCase(), visitor);
}
if (document_number) {
this._byDocumentNumber.set(document_number.toLowerCase(), visitor);
}
}
}
byDocumentNumber(documentNumber: string): IVisitor | undefined {
return this._byDocumentNumber.get(documentNumber);
}
byCode(code: string): IVisitor | undefined {
return this._byCode.get(code);
}
}
class YourControllerClass {
private listenScanerHandler(scanResponse: any): void {
if (!scanResponse || scanResponse.errorDesc !== "SUCCESS") {
this.messageService.showMessage(
"",
getMessage(GlobalModel.getCurrentLanguage(), "009"),
"error"
);
return;
}
const visitors: VisitorCollection = this.visitorService.visitors$.getValue();
const { qrcode, document_number } = scanResponse;
let foundVisitor: IVisitor | undefined;
if (qrcode) {
foundVisitor = visitors.byCode(qrcode.toLowerCase());
} else if (document_number) {
foundVisitor = visitors.byDocumentNumber(document_number.toLowerCase());
}
if (foundVisitor) {
this.visitorWasFound(foundVisitor);
} else {
this.visitorNotFound(scanResponse);
}
}
}
Соответственно,
VisitorService.visitors$
выше имеет тип
BehaviorSubject<VisitorCollection>
и заполняется вызовом вроде
visitorService.visitors$.next(new VisitorCollection(visitorList))