สมมติว่าเราสร้างฟังก์ชัน 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 เพื่อให้เรียกใช้เป็นฟังก์ชันของสตริงได้