บางครั้งความต้องการประเภทนี้จะพบและคุณต้องลบองค์ประกอบที่ซ้ำกันในอาร์เรย์และเก็บไว้เพียงอย่างเดียว วิธีแรกที่นึกถึงอาจใช้ 2 สำหรับลูปเพื่อเปรียบเทียบและลบองค์ประกอบที่ซ้ำกัน รหัสมีดังนี้:
วิธีที่ 1:
การคัดลอกรหัสมีดังนี้:
array.prototype.distinct = function () {
var arr = []
len = this.length;
สำหรับ (var i = 0; i <len; i ++) {
สำหรับ (var j = i+1; j <len; j ++) {
ถ้า (นี่ [i] === สิ่งนี้ [j]) {
j = ++ i;
-
-
arr.push (นี่ [i]);
-
กลับ arr;
-
วิธีการใช้งาน 1 หากคุณพบข้อมูลเพิ่มเติมประสิทธิภาพของคุณจะแย่ลงมาก จากนั้นโปรดดูวิธีการต่อไปนี้ต่อไป
วิธีที่ 2:
การคัดลอกรหัสมีดังนี้:
array.prototype.distinct = function () {
var self = this,
arr = self.concat (). sort (); // สร้างอาร์เรย์ใหม่และเรียงลำดับ
arr.sort (ฟังก์ชั่น (a, b) {
if (a === b) {
var n = self.indexof (a); // รับค่าดัชนี
self.splice (n, 1);
-
-
กลับมาเอง
-
วิธีที่ 2 ใช้ฟังก์ชั่นการโทรกลับแบบกำหนดเองและยังใช้ INDEXOF ซึ่งเป็นวิธีที่ไม่ได้รับการสนับสนุนโดย IE6/7/8 แน่นอนว่าดัชนีสามารถจำลองได้ด้วยตัวเอง แต่ปัญหาที่ใหญ่กว่าคือมีความแตกต่างระหว่างวิธีการเรียงลำดับของ IE6/7/8 และเบราว์เซอร์มาตรฐาน มีดักมากมายในฟังก์ชั่นการโทรกลับแบบกำหนดเองที่ใช้วิธีการเรียงลำดับใน IE6/7/8 รหัสของฟังก์ชั่นการโทรกลับเรียงลำดับแบบกำหนดเองข้างต้นจะรายงานข้อผิดพลาด "หมายเลขที่หายไป" โดยตรงใน IE6/7/8 หากฟังก์ชั่นการโทรกลับส่งคืน NAN ข้อผิดพลาดนี้จะถูกรายงานเนื่องจากในทางทฤษฎีฟังก์ชั่นการโทรกลับสามารถส่งคืนจำนวนเต็มเท่านั้น แม้ว่าค่าคืนจะถูกละเว้น แต่ก็ยังมีปัญหาอื่น ๆ และในที่สุดก็ไม่มีปัญหามากเกินไป วิธีที่ 2 จะไม่ทำงานใน IE6/7/8
จากท่าเทียบเรือของคนโง่นี่คือรหัสของเขา:
การคัดลอกรหัสมีดังนี้:
array.prototype.delRepeat = function () {
var newarray = [];
var provisionAltable = {};
สำหรับ (var i = 0, item; (item = this [i])! = null; i ++) {
if (! provisionAltable [item]) {
newarray.push (รายการ);
ProvisionAltable [item] = true;
-
-
กลับนิวร์เรย์;
-
วิธีที่ 3 ใช้วัตถุชั่วคราวเพื่อจัดเก็บองค์ประกอบของอาร์เรย์ หากคุณพบองค์ประกอบอาร์เรย์ที่ซ้ำกันมันจะถูกละเว้น อย่างไรก็ตามหากคุณพบอาร์เรย์ต่อไปนี้:
การคัดลอกรหัสมีดังนี้:
var arr = ['firefox', 1, '1'];
หากอาร์เรย์ด้านบนถูกใช้ในวิธีที่ 3 มันจะลบ 1 และ "1" เป็นองค์ประกอบที่ซ้ำกันผิดพลาดดังนั้นการปรับเปลี่ยนวิธีการที่ 3 เล็กน้อยสามารถแก้ไขได้
วิธีการแก้ไขของวิธี 3:
การคัดลอกรหัสมีดังนี้:
array.prototype.distinct = function () {
var arr = []
obj = {}
i = 0,
len = this.length,
ผลลัพธ์;
สำหรับ (; i <len; i ++) {
ผลลัพธ์ = สิ่งนี้ [i];
if (obj [result]! == ผลลัพธ์) {
arr.push (ผลลัพธ์);
obj [ผลลัพธ์] = ผลลัพธ์;
-
-
กลับ arr;
-
ต่อมาฉันอ่านความคิดเห็นในตอนท้ายของบทความเกี่ยวกับ Fools Wharf วิธีนี้เหมือนกับวิธีการที่ Rekey ให้ไว้ แต่วิธีนี้ก็มีข้อบกพร่องเช่นกัน หากคุณพบอาร์เรย์ 2B เช่นนี้คุณจะสบายดี:
การคัดลอกรหัสมีดังนี้:
var arr = ['firefox', 1, '1', 1];
อาร์เรย์ข้างต้นได้รับการแก้ไขด้วยวิธีที่ 3 และองค์ประกอบ 3 รายการสุดท้ายจะไม่ถูกลบ อย่างไรก็ตามอาร์เรย์ประเภทนี้ค่อนข้างรุนแรง หากคุณพบข้อมูลที่มีขนาดและจำนวนสตริงที่แท้จริงเท่ากันคุณควรประมวลผลล่วงหน้าเพื่อหลีกเลี่ยงข้อผิดพลาดนี้ วิธีการใช้วัตถุชั่วคราวนั้นเร็วกว่าการเรียงลำดับในเบราว์เซอร์มาตรฐานเล็กน้อยและอัลกอริทึมของวิธีการเรียงลำดับควรแตกต่างกันในแต่ละเบราว์เซอร์