ความท้าทายนี้ทำให้ฉันนิ่งงันมานานเกินไป เมื่อคุณได้พัฒนาแนวความคิดแล้ว คุณจะรู้สึกเหมือนเป็นคนงี่เง่า เราจำเป็นต้องสร้างฟังก์ชันที่มองผ่านอาร์เรย์ของวัตถุ (อาร์กิวเมนต์แรก) และส่งกลับอาร์เรย์ของวัตถุทั้งหมดที่มีคุณสมบัติและคู่ค่าที่ตรงกัน (อาร์กิวเมนต์ที่สอง)
คุณควรจะคุ้นเคยกับวิธีการเลือกองค์ประกอบจากอาร์เรย์
var arr = [[1], [2]] console.log(arr[0]) //logs [1] console.log(arr[1]) //logs [2]
และเข้าใจว่าองค์ประกอบสามารถเลือกได้จากอาร์เรย์ย่อยในลักษณะเดียวกัน
var arr = [[1,4,3], [1,2,3]] console.log(arr[0][1]) //logs 4
กุญแจสำคัญในการเอาชนะความท้าทายนี้คือการทำความเข้าใจสิ่งที่ Object.keys()
ทำ ตัวอักษรของวัตถุในอาร์เรย์ collection
ได้แทนที่แป้นตัวเลขด้วยคำ ดังนั้นคุณจะไม่สามารถเลือกองค์ประกอบในอาร์เรย์ด้วยแป้นตัวเลขเหมือนที่คุณคุ้นเคยได้อีกต่อไป
function whatIsInAName(collection, source) { console.log(collection[1][0]) // logs undefined } whatIsInAName([{ first: “Romeo”, last: “Montague” }, { first: “Mercutio”, last: null }, { first: “Tybalt”, last: “Capulet” }], { last: “Capulet” });
อย่างไรก็ตาม หากคุณใช้ปุ่มเพื่อเลือกค่า "แรก" ก็จะใช้งานได้:
function whatIsInAName(collection, source) { console.log(collection[1].first) console.log(collection[1][“first”]) // Both log Mercutio } whatIsInAName([{ first: “Romeo”, last: “Montague” }, { first: “Mercutio”, last: null }, { first: “Tybalt”, last: “Capulet” }], { last: “Capulet” });
ดังนั้นคุณจะเห็นว่าสิ่งที่เราต้องทำคือนำค่าคีย์จาก source
ไปใช้กับ Object.keys(source)
function whatIsInAName(collection, source) { var key = Object.keys(source); console.log(key) //logs [‘last’] } whatIsInAName([{ first: “Romeo”, last: “Montague” }, { first: “Mercutio”, last: null }, { first: “Tybalt”, last: “Capulet” }], { last: “Capulet” });
จากนั้นเราจำเป็นต้องวนซ้ำผ่าน collection
เพื่อตรวจสอบว่าคุณสมบัติใดมีค่าที่ตรงกับค่าของ source
หรือไม่ นอกจากนี้เรายังต้องทำทีละครั้ง และสำหรับคีย์ทั้งหมดที่มีอยู่ใน source
ดังนั้นเราจึงต้องการเขียนฟังก์ชันที่ใช้ตัวกรองเพื่อพิจารณาว่าสมาชิกของ collection
is จะถูกลบออกหรือไม่ หากอาร์เรย์เสร็จสมบูรณ์ เราต้องการคืนค่าจริง ถ้าไม่เป็นเท็จ
function whatIsInAName(collection, source) { var arr =[]; var result =undefined; var keys = Object.keys(source); console.log(keys.length); function check(item){ for (var i = 0; i < keys.length; i++){ if (item.hasOwnProperty(keys[i]) && item[keys[i]] == source[keys[i]]){ result = true; } else result = false; } return result; } arr = collection.filter(check); return arr; // Only change code above this line } whatIsInAName([{ “a”: 1, “b”: 2 }, { “a”: 1 }, { “a”: 1, “b”: 2, “c”: 2 }], { “a”: 1, “b”: 2 });