1. ตามหลักการของคีย์ที่ไม่ได้ทำซ้ำของคีย์ในวัตถุ JS วิธีการจดจำอาร์เรย์มีดังนี้ตามความคิดทั่วไปที่สุด:
คัดลอกรหัสรหัสดังนี้:
ฟังก์ชั่น DISTRICTRARAY (arr) {
var obj = {}, temp = [];
สำหรับ (var i = 0; i <arr.length; i ++) {
if (! obj [arr [i]]) {{
temp.push (arr [i]);
obj [arr [i]] = true;
-
-
กลับอุณหภูมิ;
-
var testarr = [1,2,3,2];
console.log (dischetarray (testarr)); // [1,2,3]
มันดูค่อนข้างดี แต่ถ้ามันกลายเป็นสถานการณ์:
var testarr1 = [1,2,3, "2"];
console.log (dischetarray (testarr)); // [1,2,3]
มันกลายเป็นผลลัพธ์เดียวกันนี้ไม่ใช่สิ่งที่เราต้องการ .
ในการตอบสนองต่อข้างต้นเราปรับปรุงวิธีการข้างต้น:
คัดลอกรหัสรหัสดังนี้:
ฟังก์ชั่น DISTRICTERARRAYIMPROVE (arr) {
var obj = {}, temp = [];
สำหรับ (var i = 0; i <arr.length; i ++) {
if (! obj [typeof (arr [i])+arr [i]) {) {
temp.push (arr [i]);
obj [typeof (arr [i])+arr [i]] = true;
-
-
กลับอุณหภูมิ;
-
วิธีการข้างต้นจะเพิ่มคำนำหน้าของ TypeoF เมื่อใส่คีย์ในวัตถุดังนั้นเรามาดูเอฟเฟกต์
var testarr1 = [1,2,3, "2"];
console.log (dischetarray (testarr)); // [1,2,3, "2"
อ๊ะดี! ฟังก์ชั่นนี้โอเคมาดูสถานการณ์อื่น!
var testarr1 = [1,2,3, "2", {a: 1}, {b: 1}];
console.log (dischetarray (testarr));
ผลลัพธ์นี้จะลบ {b: 1} เพื่อลบอย่างลึกลับ .
2. ใน 1 ใน 1 ความคิดหลักของเราคือการใช้แนวคิดของคีย์ในวัตถุ JS เพื่อเป็นแนวทางในการคิดของเรา แต่ในที่สุดก็ไม่มีวิธีแก้ปัญหาทั้งหมด เราต้องการ
ใช้วิธีการชิ้นและประกบเพื่อให้ได้น้ำหนักของอาร์เรย์ดังนี้:
คัดลอกรหัสรหัสดังนี้:
ฟังก์ชั่น distancerray2 (arr) {{
test var = arr.slice (0);
สำหรับ (var i = 0; i <temp.length; i ++) {
สำหรับ (j = i+1; j <temp.length; j ++) {
if (temp [j] == temp [i]) {
Temp.splice (J, 1);
J ---;
-
-
-
กลับอุณหภูมิ;
-
ทดสอบ:
var testarr1 = [1,2,3, "2"];
console.log (dischetarray (testarr)); // [1,2,3]
var testarr2 = [1,2,2, {a: 1}, {a: 1}, {a: 1, b: 2}, ฟังก์ชัน () {alert ("b");}, ฟังก์ชัน () {แจ้งเตือน ("B");}] ;;
// [1,2, {a: 1}, {a: 1}, {a: 1, b: 2}, ฟังก์ชัน () {alert ("b");}, ฟังก์ชัน () {แจ้งเตือน ("B ("B");}]
ผลการทดสอบยังไม่สามารถตอบสนองความต้องการของเราได้ หลังจากศึกษาวิธีการข้างต้นของทีมงานของเราเราพบว่าปัญหาหลักอยู่ในการดำเนินการเปรียบเทียบวัตถุทั้งสอง เท่าเทียมกันในสถานการณ์นี้เราทำได้เราเราเราเราเราสามารถทำได้
คัดลอกรหัสรหัสดังนี้:
ฟังก์ชั่น distancerrayall (arr) {
var isequal = function (obj1, obj2) {{
// สองวัตถุมีค่าเท่ากันและต้องเท่ากัน
if (obj1 === obj2) {{
กลับมาจริง;
-
if (typeof (obj1) == typeof (obj2)) {{
if (ibj1) == "Object" && typeof (obj2) == "Object") {{
var pcount = 0;
สำหรับ (var p ใน obj1) {
pcount ++;
if (! isequal (obj1 [p], obj2 [p]) {{
กลับเท็จ;
-
-
สำหรับ (var p ใน obj2) {
pcount-;
-
ส่งคืน pcount == 0;
} อื่นถ้า (typeof (obj1) == "function" && typeof (obj2) == "function") {
if (obj1.toString () !! = obj2.toString ()) {
กลับเท็จ;
-
} อื่น {
if (obj1! = obj2) {{
กลับเท็จ;
-
-
} อื่น {
กลับเท็จ;
-
กลับมาจริง;
-
test var = arr.slice (0);
สำหรับ (var i = 0; i <temp.length; i ++) {
สำหรับ (j = i+1; j <temp.length; j ++) {
ifqual (temp [j], temp [i]) {{) {{
Temp.splice (J, 1);
J ---;
-
-
-
กลับอุณหภูมิ;
-
ทดสอบ:
var testarr3 = [1,2,2, {a: 1}, {a: 1}, {a: 1, b: 2}, ฟังก์ชัน () {alert ("b");}, ฟังก์ชัน () {แจ้งเตือน ("B");}] ;;
console.log (dischealArrayall (testarr3));
// ผลลัพธ์ [1,2, {a: 1}, {a: 1, b: 2}, function () {alert ("b");}]
อ๊ะในที่สุดก็ประสบความสำเร็จในการทำงานหนัก เราสามารถเห็นได้ว่าวิธีสุดท้ายคือการเน้นกฎหมายซึ่งอาจเป็นสิ่งสำคัญสำหรับอาร์เรย์ที่ซับซ้อน แต่ค่าใช้จ่ายการดำเนินการที่สอดคล้องกันนั้นค่อนข้างใหญ่ หนักซึ่งต้องการให้เราเลือกอัลกอริทึมที่สอดคล้องกันอย่างยืดหยุ่นตามความต้องการ