ค้นหาเว็บไซต์

javascript - httpParams ลบพารามิเตอร์ที่เป็น undefined


ฉันต้องส่งพารามิเตอร์ใน URL ของฉันเพื่อรับข้อมูลที่ถูกกรองจากเซิร์ฟเวอร์

ฉันตั้งค่าพารามิเตอร์แบบนี้

const queryParams = new HttpParams(
      {
        fromObject: {
          page: this.paginator.pageIndex.toString(),
          pageSize: this.paginator.pageSize.toString(),
          search: this.searchKey,
          sortBy: this.selectedFilterByStatusValue,
          sortByType: this.selectedFilterSortByValue
        }
      });

และในการรับใช้ของฉัน

 getData(params: HttpParams) {
    return this.apiService.get<IResponseList<IData>>(`${this.url}/list`, params);
  }

ปัญหาคือ เมื่อไม่ได้เลือกตัวกรองบางตัว เพราะฉันไม่ต้องการใช้ และมันถูกตั้งค่าเป็น undefined แต่สิ่งนี้ไม่ถูกต้อง... ฉันต้องการลบพารามิเตอร์ที่เป็น undefined ออก

นี่คือ console.log สำหรับ queryParams

cloneFrom: null
encoder: HttpUrlEncodingCodec {}
map: Map(5)
  [[Entries]]
  0: {"page" => Array(1)}
  1: {"pageSize" => Array(1)}
      key: "pageSize"
      value: ["3"]
  2: {"search" => Array(1)}
  3: {"sortBy" => Array(1)}
  4: {"sortByType" => Array(1)}

ฉันพยายามใช้ .set("page", this.paginator.pageIndex) และ .append(...) แต่ฉันก็มักจะได้โครงสร้างเดียวกันเสมอ

นอกจากนี้ ฉันพยายามแก้ไขโดยตรงในบริการนี้ แต่สิ่งนี้ไม่ได้ผล ฉันยังคงได้รับ undefined

this.httpClient.get(`${this.url}/list`, { 
  params: Object.entries(queryParameterObject).reduce((queryParams, [key, value]) => queryParams.set(key, value), new HttpParams());
});

ขอบคุณ

คำตอบ #1

นี่คือบรรทัดเดียวที่ฉันคิดว่าอาจใช้ได้สำหรับคุณ :

const newQueryParameterObject = Object.entries(queryParameterObject).reduce(
    (acc, [key, value]) => ({ ...acc, ...((value != null) & { [key]: value }) }),
    {}
);

this.httpClient.get(`${this.url}/list`, { params: new HttpParams({fromObject:newQueryParameterObject}) });

มันจะทำความสะอาดตัวแปรที่มีค่าที่เป็น null หรือ undefined

คำตอบ #2

พยายามข้ามพวกมันใน reduce

this.httpClient.get(`${this.url}/list`, { 
  params: queryParameterObject ? queryParameterObject.keys().reduce((queryParams, key) => {
  // getting value from map
  let value: any = queryParameterObject.get(key);

  // extracting value if it's an array
  value = Array.isArray(value) ? value[0] : value;

  // adding only defined values to the params
  if (value !== undefined && value !== null) {
    queryParams[key] = value;
  }

  return queryParams;
}, {}) : {};
});

บทความที่เกี่ยวข้อง