1. Menurut prinsip kunci Key yang tidak diulang dalam objek JS, metode yang diingat array adalah sebagai berikut sesuai dengan pemikiran yang paling konvensional:
Salin kode kode sebagai berikut:
Function DifistArray (arr) {
var obj = {}, temp = [];
untuk (var i = 0; i <arr.length; i ++) {
if (! obj [arr [i]]) {{
temp.push (arr [i]);
obj [arr [i]] = true;
}
}
Kembalikan suhu;
}
var testarr = [1,2,3,2];
Console.log (DifistaRay (Testarr));
Itu terlihat cukup bagus, tetapi jika itu berubah menjadi situasi:
var testarr1 = [1,2,3, "2"];
Console.log (DifistaRay (Testarr));
Ternyata hasil yang sama. .
Menanggapi hal di atas, kami meningkatkan metode di atas:
Salin kode kode sebagai berikut:
Function DifistArrayImprove (arr) {
var obj = {}, temp = [];
untuk (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;
}
}
Kembalikan suhu;
}
Metode di atas menambahkan awalan TypeOf saat kunci dimasukkan ke dalam objek, jadi mari kita lihat efeknya.
var testarr1 = [1,2,3, "2"];
Console.log (DifistaRay (Testarr));
Ups, bagus! Jadi apakah fungsi ini benar -benar ok, mari kita lihat situasi lain!
var testarr1 = [1,2,3, "2", {a: 1}, {b: 1}];
Console.log (Difistarray (Testarr));
Hasil ini, cara menghapus {b: 1} untuk menghapusnya secara tidak dapat dijelaskan. .
2. Dalam 1 dalam 1, ide utama kami adalah menggunakan konsep kunci dalam objek JS untuk memandu pemikiran kita, tetapi pada akhirnya tidak ada solusi untuk semua masalah. kami menginginkannya
Gunakan metode irisan dan sambungan untuk mencapai berat array, sebagai berikut:
Salin kode kode sebagai berikut:
Function distancerray2 (arr) {{
var test = arr.slice (0);
untuk (var i = 0; i <temp.length; i ++) {
untuk (j = i+1; j <temp.length; j ++) {
if (temp [j] == temp [i]) {
Temp.Splice (J, 1);
J ---;
}
}
}
Kembalikan suhu;
}
tes:
var testarr1 = [1,2,3, "2"];
Console.log (DifistaRay (Testarr));
var testarr2 = [1,2,2, {a: 1}, {a: 1}, {a: 1, b: 2}, function () {waspada ("b");}, function () {ware ("B");}];;
// [1,2, {a: 1}, {a: 1}, {a: 1, b: 2}, function () {waspada ("b");}, function () {waspada ("b (" B ");}]
Hasil tes masih tidak dapat memenuhi kebutuhan kita. Setelah mempelajari metode di atas tim kami, kami menemukan bahwa masalah utama adalah dalam operasi membandingkan dua objek. Equal.
Salin kode kode sebagai berikut:
Fungsi distancerrayall (arr) {
var isEqual = function (obj1, obj2) {{
// Dua objek sama, dan mereka harus sama.
if (obj1 === obj2) {{
Kembali Benar;
}
if (typeof (obj1) == typeof (obj2)) {{
if (ibj1) == "objek" && typeof (obj2) == "objek") {{
var pcount = 0;
untuk (var p dalam obj1) {
pcount ++;
if (! isequal (obj1 [p], obj2 [p]) {{{
Mengembalikan false;
}
}
untuk (var p dalam obj2) {
pcount-;
}
Return pcount == 0;
} Lain jika (typeof (obj1) == "function" && typeof (obj2) == "function") {
if (obj1.toString () !! = obj2.toString ()) {
Mengembalikan false;
}
} Kalau tidak {
if (obj1! = obj2) {{
Mengembalikan false;
}
}
} Kalau tidak {
Mengembalikan false;
}
Kembali Benar;
}
var test = arr.slice (0);
untuk (var i = 0; i <temp.length; i ++) {
untuk (j = i+1; j <temp.length; j ++) {
ifqual (temp [j], temp [i]) {{) {{{{
Temp.Splice (J, 1);
J ---;
}
}
}
Kembalikan suhu;
}
tes:
var testarr3 = [1,2,2, {a: 1}, {a: 1}, {a: 1, b: 2}, function () {alert ("b");}, function () {ware ("B");}];;
Console.log (DifistarRayall (Testarr3));
// Hasil [1,2, {a: 1}, {a: 1, b: 2}, function () {alert ("b");}]
Ups, akhirnya berhasil menyelesaikan tugas berat yang berat. Kita dapat melihat bahwa metode terakhir adalah untuk menekankan hukum, yang dapat menjadi penting untuk array yang kompleks, tetapi overhead eksekusi yang sesuai juga cukup besar. Berat, yang mengharuskan kita untuk secara fleksibel memilih algoritma yang sesuai sesuai dengan kebutuhan.