Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> JavaScript

สร้าง Polyfill แทนที่การเกิดครั้งที่ n ของสตริงใน JavaScript

สมมติว่าเราสร้างฟังก์ชัน polyfill removeStr() ที่รับสามอาร์กิวเมนต์

  • subStr → สตริงย่อยที่จะลบออก
  • num → หมายเลขลำดับ (ครั้งที่ num) ของ subStr ที่จะลบจากสตริง

ฟังก์ชันควรคืนสตริงใหม่ถ้าลบสำเร็จ มิฉะนั้นคืน -1 ในทุกกรณี

เช่น

const str = 'drsfgdrrtdr';
console.log(str.removeStr('dr', 3));

ผลลัพธ์ที่คาดหวัง

'drsfgdrrt'

เขียนโค้ด

ตัวอย่าง

const str = 'drsfgdrrtdr';
const subStr = 'dr';
const num = 2;
removeStr = function(subStr, num){
  if(!this.includes(subStr)){
    return -1;
  }
  let start = 0, end = subStr.length;
  let occurences = 0;
  for(; ;end < this.length){
    if(this.substring(start, end) === subStr){
      occurences++;
    };
    if(occurences === num){
      return this.substring(0, start) + this.substring(end, this.length);
    };
    end++;
    start++;
  }
  return -1;
}
String.prototype.removeStr = removeStr;
console.log(str.removeStr(subStr, num));

ผลลัพธ์

ผลลัพธ์ในคอนโซลจะเป็น

drsfgrtdr

การทำความเข้าใจโค้ด

  • ฟังก์ชัน removeStr() ตรวจสอบก่อนว่ามี subStr อย่างน้อยหนึ่งครั้งหรือไม่ ถ้าไม่มีให้ออกและคืน -1
  • ใช้演算法 sliding window (หน้าต่างเลื่อน) เพื่อนับจำนวนครั้งที่ subStr ปรากฏในสตริง (ขนาดหน้าต่างเท่ากับความยาว subStr)
  • เริ่มจากหน้าต่างซ้ายสุด แล้วเลื่อนจนขอบขวาของหน้าต่างถึงขอบขวาของสตริงต้นทาง
  • ถ้าในระหว่างทาง จำนวนครั้งที่พบเท่ากับที่ต้องการ ให้ตัด occurrence นั้นออกและคืนสตริงใหม่
  • ถ้าวนจนจบสตริง หมายถึงไม่มี occurrence พอ และควรคืน -1 และออกจากฟังก์ชัน

สุดท้าย เราเพิ่มคุณสมบัติ removeStr ให้ String.prototype เพื่อให้เรียกใช้เป็นฟังก์ชันของสตริงได้