---
# System prepended metadata

title: "\U0001F4CC[R]2020/11/06前端會議"
tags: [會議紀錄]

---

###### tags: `會議紀錄`
###### Thunder:
###### CodeReview: `效能改善 #防彈跳`
###### Announcement:
###### Attendee: 政儀、偉恩、政儒、宜臻
# 📌[R]2020/11/06前端會議
## 踩雷事件
### ⚡無踩雷事件

## 寫法交流
### ⛏效能改善 #防彈跳
行動版的搜尋，目前會打一下就馬上查詢，讓效能不是很優，銷貨單上有個客戶下拉窗，它的搜尋有做防彈跳(輸入後延遲搜尋)的程式，行動版的可能可以參考參考看看。

==search-limit.pipe.ts==
```typescript=
import { debounceTime, map, delay } from 'rxjs/operators';
import { Pipe, PipeTransform } from '@angular/core';
import { of, Observable } from 'rxjs';

@Pipe({
  name: 'searchLimit',
  pure: true
})
export class SearchLimitPipe implements PipeTransform {
  /** 限制筆數 當超過此筆數時 依搜尋字顯示 (可依需求變動) */readonly LIMIT = 500;

  /** 未查詢時最大筆數 */readonly NOWORD_LIMIT = 10;
  /** 查詢時最大回覆數 */readonly RESPONSE_LIMIT = 50;

  /**
   * @param v 搜尋資料
   * @param searchWord 關鍵字
   * @param searchKey 搜尋的資料欄位
   * @param limit 限制筆數 當超過此筆數時 依搜尋字顯示
   */
  transform(v: any[], searchWord: string, searchKey: string[], limit: number): Observable<any[]> {
    if (!v) { return of([]); }
    const LIMIT = limit || this.LIMIT;
    searchKey = searchKey || ['ID', 'Name'];
    searchWord = searchWord || '';
    const data: { [key: string]: any, getSearchKey: () => string[] }[] = v;


    // limit
    if (data.length > LIMIT && !searchWord) {
      return of(data.filter((x, i) => i < this.NOWORD_LIMIT));
    }

    if (!searchWord) { return of(data); }

    /**資料越多 延遲越長 */
    const delayTime = data.length > 10000 ? 1000 : 400;

    return of(null).pipe(
      delay(delayTime),
      map(() => {
        const searchData: any[] = [];
        data.forEach((i) => {
          const keyData = {};
          const keys = searchKey;
          keys.forEach((key) => { keyData[key] = i[key]; });
          searchData.push(keys.length ? keyData : i);
        });

        // searchWord = searchWord.toUpperCase();
        const matchDataIndex = searchData.map((el, i) => {
          const test = JSON.parse(JSON.stringify(el));
          let testString = JSON.stringify(test);
          // 去除key值
          Object.keys(test).forEach(k => {
            testString = testString.replace(k, '');
          });
          const matchData = testString.indexOf(searchWord) !== -1;
          return matchData;
        });
        return data.filter((x, i) => matchDataIndex[i]).filter((x, i) => i < this.RESPONSE_LIMIT);
      })
    );
  }

}
```

## 事情公告
### 📢無事情公告