ปัญหา
เราจำเป็นต้องเขียนฟังก์ชัน JavaScript ที่รับสองอาร์เรย์ arr1 และ arr2 เป็นอาร์กิวเมนต์ที่หนึ่งและที่สองตามลำดับ
ฟังก์ชันควรหาจุดตัด (องค์ประกอบทั่วไประหว่างทั้งสอง) ของอาร์เรย์ และหากมีองค์ประกอบที่ปรากฏสองครั้งในอาร์เรย์ทั้งสอง เราควรรวมไว้สองครั้งในอาร์เรย์ผลลัพธ์ด้วย
ตัวอย่างเช่น หากอินพุตของฟังก์ชันคือ −
const arr1 = [2, 7, 4, 6, 7, 4]; const arr2 = [7, 1, 9, 7, 4, 5];
จากนั้นผลลัพธ์ควรเป็น −
const output= [7, 7, 4];
ตัวอย่าง
รหัสสำหรับสิ่งนี้จะเป็น −
const arr1 = [2, 7, 4, 6, 7, 4]; const arr2 = [7, 1, 9, 7, 4, 5]; const intersect = (arr1 = [], arr2 = []) => { const map = {}; arr1.forEach(a => { map[a] = map[a] ? map[a] + 1 : 1; }) const result = []; for(let key of arr2) { if(key in map && map[key] > 0) { result.push(key); map[key]--; } } return result; }; console.log(intersect(arr1, arr2));
คำอธิบายโค้ด:
ขั้นตอนที่เราทำคือ −
-
วนรอบอาร์เรย์แรก (arr1) เพื่อค้นหาการเกิดขึ้นของแต่ละหมายเลข ในนั้น
-
วนซ้ำอาร์เรย์ที่สอง (arr12) เพื่อดูว่าองค์ประกอบใน arr2 มีอยู่ใน arr1 ที่แมปหรือไม่
-
หากมีอยู่ ให้ลดค่าใน num1 ที่แมปแล้วดันองค์ประกอบในอาร์เรย์ผลลัพธ์
ผลลัพธ์
และผลลัพธ์ในคอนโซลจะเป็น −
[7, 7, 4]