เมื่อทำการดำเนินการอาร์เรย์คุณมักจะพบปัญหาของการลบซ้ำ ต่อไปนี้เป็นการแนะนำสั้น ๆ เกี่ยวกับวิธีการซ้ำซ้อนของอาร์เรย์
ดัชนีของการขจัดข้อมูลซ้ำซ้อน
array.prototype.unique1 = function () {var arr = []; สำหรับ (var i = 0; i <this.length; i ++) {var item = this [i]; ถ้า (arr.indexof (รายการ) === -1) {arr.push (รายการ); arr;} [1,2,3, '4', 3,4,3,1, '34 ', 2] .unique1 (); // [1, 2, 3, "4", 4, "34"]อย่างไรก็ตามภายใต้ IE6-8 วิธีการดัชนีของอาร์เรย์ยังไม่มีอยู่ (แม้ว่านี่จะเป็นหัวข้อเก่า ๆ o (∩_∩) o ~) แต่โปรแกรมเมอร์ต้องเขียนวิธีการดัชนีของวิธี:
var indexof = [] .indexof? ฟังก์ชั่น (arr, item) {return arr.indexof (item);}: induction indexof (arr, item) {สำหรับ (var i = 0; i <arr.length; i ++) {ถ้า (arr [i] === รายการ) {return i;}} return -1; i ++) {var item = this [i]; if (arr.indexof (item) === -1) {arr.push (รายการ);}} return arr;} [1,2,3, '4', 3,4,3,1, '34 ', 2] .Unique2 (); // [1, 2, 3, "4", 4, "34"]INDEXOF ยังสามารถใช้วิธีการสร้างใหม่นี้:
array.prototype.unique3 = function () {var arr = [this [0]]; สำหรับ (var i = 1; i <this.length; i ++) {ถ้า (this.indexof (นี่ [i]) == i) {arr.push (นี่ [i]);}} return arr;} [1,2,3, '4', 3,4,3,1, '34 ', 2] // [1, 2, 3, "4", 4, "34"]แฮชเพื่อโหลดซ้ำ
ดัชนีด้านบนถูกต้อง แต่ในแง่ของประสิทธิภาพสองรอบจะลดประสิทธิภาพ จากนั้นเราใช้แฮช
array.prototype.unique4 = function () {var arr = []; var hash = {}; สำหรับ (var i = 0; i <this.length; i ++) {var item = this [i]; var key = typeof (รายการ)+itemif arr;} [1,2,3, '4', 3,4,3,1, '34 ', 2] .unique4 (); // [1, 2, 3, "4", 4, "34"]แกนกลางคือการสร้างวัตถุแฮชเพื่อแทนที่ดัชนีของ เปลี่ยนพื้นที่เป็นเวลา โปรดทราบว่าใน JavaScript ค่าคีย์ของวัตถุสามารถเป็นสตริง (แน่นอนว่า ES6 ให้โครงสร้างข้อมูลแผนที่มันคล้ายกับวัตถุและยังเป็นคอลเลกชันของคู่คีย์-ค่า แต่ขอบเขตของ "คีย์" ไม่ได้ จำกัด อยู่ที่สตริงค่าทั้งหมด ซึ่งเป็นการแสดงโครงสร้างแฮชที่สมบูรณ์ยิ่งขึ้น) ดังนั้น var key = typeof (รายการ) + รายการจำเป็นต้องแยกความแตกต่างระหว่างค่า 1 และสตริง '1'
ถ้าคุณต้องการให้ '4' และ 4 ถือว่าเหมือนกัน (วิธีอื่น ๆ ก็เหมือนกัน)
array.prototype.unique5 = function () {var arr = []; var hash = {}; สำหรับ (var i = 0, len = this.length; i <len; i ++) {ถ้า (! hash [this [i]]) {arr.push arr;} [1,2,3, '4', 3,4,3,1, '34 ', 2] .unique5 (); // [1, 2, 3, "4", "34"]หลังจากเรียงลำดับแล้ว
array.prototype.unique6 = function () {this.sort (); var arr = [this [0]]; สำหรับ (var i = 1; i <this.length; i ++) {ถ้า (นี่ [i]! == arr [arr.length-1]) arr;} [1,2,3, '4', 3,4,3,1, '34 ', 2] .unique6 (); // [1, 2, 3, "34", "4", 4]เรียงลำดับอาร์เรย์ก่อนจากนั้นเปรียบเทียบสองค่าที่อยู่ติดกัน เมื่อเรียงลำดับให้ใช้วิธีการเรียงลำดับของ JS ดังนั้นจึงเร็วมาก มีข้อเสียเปรียบเพียงวิธีเดียวสำหรับวิธีนี้และตัวละครจะถูกเรียงลำดับตามลำดับของการเข้ารหัสอักขระเมื่อเปรียบเทียบอักขระ ดังนั้นคุณจะเห็นว่า 10 ได้รับการจัดอันดับเป็นอันดับแรกใน 2 อย่างไรก็ตามมันจะไม่ส่งผลกระทบต่อการกำจัดน้ำหนักหนัก อย่างไรก็ตามเพื่อแก้ปัญหาการเรียงลำดับวิธีการเรียงลำดับยอมรับพารามิเตอร์ซึ่งเป็นวิธีการ:
ฟังก์ชั่นเปรียบเทียบ (ค่า 1, value2) {ถ้า (ค่า 1 <ค่า 2) {return -1;} else ถ้า (value1> value2) {return 1;} else {return 0;}} [1,2,5,2,10,3,20] .sort (เปรียบเทียบ); // [1, 2, 2, 3, 5, 10, 20]ตั้งค่าเป็นโหลดใหม่
ES6 จัดเตรียมชุดโครงสร้างข้อมูลใหม่ มันคล้ายกับอาร์เรย์ แต่ค่าของสมาชิกนั้นไม่ซ้ำกันทั้งหมดโดยไม่มีค่าที่ซ้ำกัน ตอนนี้เบราว์เซอร์ได้รับการสนับสนุนอย่างเต็มที่และรองรับโหนดเซิร์ฟเวอร์ด้วย
array.prototype.unique7 = function () {return array.from (ชุดใหม่ (this));} [1,2,3, '4', 3,4,3,1, '34 ', 2] .unique7 (); // [1, 2, 3, "4", 4, "34"]ห้องสมุดวิธีการ
แนะนำให้ใช้ Method Library underscore.js ซึ่งเป็นที่นิยมมากในโหนดหรือเบราว์เซอร์ JS
const _ = ต้องการ ('ขีดล่าง'); _. uniq ([1, 2, 1, 3, 1, 4]); // [1, 2, 3, 4]เวลาทดสอบ
วิธีการทั้งหมดข้างต้นสามารถทดสอบได้อย่างง่าย ๆ จากนั้นเปรียบเทียบและเลือกวิธีที่ดีที่สุด:
console.time ("ทดสอบ"); [1,2,3, '4', 3,4,3,1, '34 ', 2] .Unique7 (); console.timeend ("ทดสอบ"); ==> VM314: 3 การทดสอบ: 0.378msเพื่อให้ข้อมูลใหญ่ขึ้นให้สร้าง 1 ล้านตัวเลขแบบสุ่ม:
var arr = []; var num = 0; สำหรับ (var i = 0; i <1000000; i ++) {num = math.floor (math.random ()*100); arr.push (num);} console.time ("ทดสอบ"); arr.unique7 (); console.timeข้างต้นคือการเจรจาซ้ำซ้อนอาร์เรย์จาวาสคริปต์ที่ตัวแก้ไขแนะนำให้คุณตั้งแต่ช้าไปจนถึงการอดอาหารตั้งแต่ปานกลางถึงง่าย ฉันหวังว่ามันจะเป็นประโยชน์กับคุณ หากคุณมีคำถามใด ๆ โปรดฝากข้อความถึงฉันและบรรณาธิการจะตอบกลับคุณทันเวลา ขอบคุณมากสำหรับการสนับสนุนเว็บไซต์ Wulin.com!