การใช้ES6 +ในบรรทัดเดียวคุณสามารถรับรายการวัตถุที่ไม่ซ้ำกันโดยใช้คีย์:
const unique = [...new Map(arr.map(item => [item[key], item])).values()]
มันสามารถใส่ลงในฟังก์ชั่น:
function getUniqueListBy(arr, key) {
return [...new Map(arr.map(item => [item[key], item])).values()]
}
นี่คือตัวอย่างการทำงาน:
const arr = [
{place: "here", name: "x", other: "other stuff1" },
{place: "there", name: "x", other: "other stuff2" },
{place: "here", name: "y", other: "other stuff4" },
{place: "here", name: "z", other: "other stuff5" }
]
function getUniqueListBy(arr, key) {
return [...new Map(arr.map(item => [item[key], item])).values()]
}
const arr1 = getUniqueListBy(arr, 'place')
console.log("Unique by place")
console.log(JSON.stringify(arr1))
console.log("\nUnique by name")
const arr2 = getUniqueListBy(arr, 'name')
console.log(JSON.stringify(arr2))
มันทำงานยังไง
ก่อนอื่นอาร์เรย์จะถูกแมปใหม่ในลักษณะที่สามารถใช้เป็นอินพุตสำหรับ แผนที่ได้
arr.map (item => [item [key], item]);
ซึ่งหมายความว่าแต่ละรายการของอาเรย์จะถูกเปลี่ยนในอาเรย์อื่นที่มี 2 องค์ประกอบ คีย์ที่เลือกเป็นองค์ประกอบแรกและรายการเริ่มต้นทั้งหมดเป็นองค์ประกอบที่สองนี้เรียกว่ารายการ (อดีต. รายการอาร์เรย์ , รายการแผนที่ ) และนี่คือเอกสารอย่างเป็นทางการพร้อมตัวอย่างที่แสดงวิธีเพิ่มรายการอาร์เรย์ในตัวสร้างแผนที่
ตัวอย่างเมื่อสถานที่สำคัญ:
[["here", {place: "here", name: "x", other: "other stuff1" }], ...]
ประการที่สองเราส่งอาร์เรย์ที่ปรับเปลี่ยนนี้ไปยังตัวสร้างแผนที่และนี่คือสิ่งมหัศจรรย์ที่เกิดขึ้น แผนที่จะกำจัดค่าของคีย์ที่ซ้ำกันโดยคงไว้ซึ่งค่าที่แทรกไว้ล่าสุดของคีย์เดียวกันเท่านั้น
หมายเหตุ : แผนที่เก็บคำสั่งของการแทรก ( ตรวจสอบความแตกต่างระหว่างแผนที่และวัตถุ )
แผนที่ใหม่ (รายการอาร์เรย์ที่แมปไว้ด้านบน)
อันดับที่สามเราใช้ค่าแผนที่เพื่อดึงรายการต้นฉบับ แต่คราวนี้ไม่มีการทำซ้ำ
แผนที่ใหม่ (mappedArr) .values ()
และอันสุดท้ายคือการเพิ่มค่าเหล่านั้นลงในอาร์เรย์ใหม่ที่สดใหม่เพื่อให้มันสามารถดูเป็นโครงสร้างเริ่มต้นและกลับมาที่:
ส่งคืน [... แผนที่ใหม่ (mappedArr) .values ()]