有以下过滤器代码:
const foundResult = this.visitors.filter((p: IVisitor) => {
let found = false;
if ('qrcode' in this.scanResponse) {
if (this.scanResponse && p.code && this.scanResponse.qrcode) {
found = p.code.toLowerCase() === this.scanResponse.qrcode.toLowerCase();
}
} else {
if (this.scanResponse && p.document_number && this.scanResponse.document_number) {
found = p.document_number.toString().toLowerCase() === this.scanResponse.document_number.toString().toLowerCase();
}
}
return found;
});
问题是this.visitors
包含1000多个记录,因此我拍摄了一个内存屏幕,此操作需要5秒钟才能查看。
如何优化此过滤器,有何建议?
我知道if
语句在循环中不好用,但是为什么它工作这么长时间?
答案 0 :(得分:1)
您可以从函数外部的this
中获取属性,以防止检查每个周期的下降情况。
let dn = this.scanResponse && 'document_number' in this.scanResponse && this.scanResponse.document_number.toString().toLowerCase(),
qrCode = this.scanResponse && this.scanResponse.qrcode.toLowerCase();
const foundResult = this.visitors.filter((p: IVisitor) => {
return p.code.toLowerCase() === qrcode
|| p.document_number.toString().toLowerCase() === dn;
});
答案 1 :(得分:1)
在不了解应用程序其余部分的情况下,本示例中没有太多要优化的地方。 我将从过滤器中删除所有重复的计算。这样:
const checkQR = 'qrcode' in this.scanResponse;
const QR = this.scanResponse && this.scanResponse.qrcode ? this.scanResponse.qrcode.toLowerCase() : null;
const document_number = this.scanResponse && this.scanResponse.document_number ? this.scanResponse.document_number.toString().toLowerCase() : null;
const foundResult = this.visitors.filter((p: IVisitor) => {
let found = false;
if (checkQR) {
found = QR && p.code && p.code.toLowerCase() === QR;
} else {
found = document_number && p.document_number && p.document_number.toString().toLowerCase() === document_number;
}
return found;
});
其他可能的技术在很大程度上取决于您的实际代码。您可以分块读取和过滤“访问者”。您可以将此过滤移到后端,然后让数据库为您完成。您可以使“访客”模型非常小,仅包含code
和document_number
,然后从获得的位置通过过滤的ID仅加载必要的模型。