สมมุติว่าเราได้สร้างฟังก์ชัน polyfill removeStr() ที่มีสามอาร์กิวเมนต์คือ −
-
subStr → เหตุการณ์ที่จะลบ String
-
num → เป็นจำนวน (num) ที่เกิดของ subStr จะถูกลบออกจากสตริง
ฟังก์ชันควรคืนค่าใหม่ หากการลบ 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
-
จากนั้นจะใช้อัลกอริธึมหน้าต่างบานเลื่อนเพื่อบันทึกจำนวนครั้งของสตริงย่อย (ขนาดของหน้าต่างเท่ากับความยาวของ subStr)
-
เริ่มแรกเราเริ่มจากหน้าต่างซ้ายสุด จากนั้นเราค่อยเลื่อนหน้าต่างของเราไปจนสุดหน้าต่างถึงจุดสิ้นสุดของสตริงเดิม
-
หากในทางของเรา จำนวนครั้งที่เกิดขึ้นเท่ากับการเกิดขึ้นที่ต้องการ เราจะตัดทอนเหตุการณ์นั้นออกจากสตริงและส่งคืนสตริงใหม่ที่ได้รับ
-
หากเราวนซ้ำตลอดทั้งสตริง แสดงว่ามีการเกิด ofsubStr ในสตริงไม่เพียงพอ และในกรณีนี้ เราควรคืนค่า -1 และออกจากฟังก์ชัน
สุดท้าย เราเพิ่มคุณสมบัติ removeStr ให้กับ String.prototype เพื่อให้เราสามารถเรียกมันว่าเป็นฟังก์ชันสตริงได้