如何优化过滤器JS?

时间:2019-11-20 11:16:50

标签: javascript

有以下过滤器代码:

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语句在循环中不好用,但是为什么它工作这么长时间?

2 个答案:

答案 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;
});

其他可能的技术在很大程度上取决于您的实际代码。您可以分块读取和过滤“访问者”。您可以将此过滤移到后端,然后让数据库为您完成。您可以使“访客”模型非常小,仅包含codedocument_number,然后从获得的位置通过过滤的ID仅加载必要的模型。