contoh:
var arr = ["one","two","three"];
arr.forEach(function(part){
part = "four";
return "four";
})
alert(arr);
Array masih dengan nilai aslinya, apakah ada cara untuk memiliki akses penulisan ke elemen array dari fungsi iterasi?
contoh:
var arr = ["one","two","three"];
arr.forEach(function(part){
part = "four";
return "four";
})
alert(arr);
Array masih dengan nilai aslinya, apakah ada cara untuk memiliki akses penulisan ke elemen array dari fungsi iterasi?
x=[2,3,4]; x=x.map(n=>n*2); // [4,6,8]
Jawaban:
Callback melewati elemen, indeks, dan array itu sendiri.
sunting - sebagaimana tercantum dalam komentar,
.forEach()
fungsi tersebut dapat mengambil argumen kedua, yang akan digunakan sebagai nilaithis
setiap panggilan ke panggilan balik:Bahwa contoh kedua menunjukkan
arr
dirinya sedang ditetapkan sebagaithis
di callback.One mungkin berpikir bahwa array yang terlibat dalam.forEach()
panggilan mungkin standar nilaithis
, tapi apa pun alasannya itu tidak;this
akan terjadiundefined
jika argumen kedua tidak disediakan.(Catatan: hal-hal di atas tentang
this
tidak berlaku jika panggilan balik adalah=>
fungsi, karenathis
tidak pernah terikat pada apa pun ketika fungsi tersebut dipanggil.)Juga penting untuk diingat bahwa ada seluruh keluarga utilitas serupa yang disediakan pada prototipe Array, dan banyak pertanyaan muncul di Stackoverflow tentang satu fungsi atau lainnya sehingga solusi terbaik adalah dengan hanya memilih alat yang berbeda. Kamu sudah memperoleh:
forEach
untuk melakukan sesuatu dengan atau untuk setiap entri dalam array;filter
untuk menghasilkan array baru yang hanya berisi entri yang memenuhi syarat;map
untuk membuat array baru satu-ke-satu dengan mengubah array yang ada;some
untuk memeriksa apakah setidaknya satu elemen dalam array cocok dengan deskripsi;every
untuk memeriksa apakah semua entri dalam array cocok dengan deskripsi;find
untuk mencari nilai dalam arraydan seterusnya. Tautan MDN
sumber
part
(atau bahkano
dalam es6) tidak terdefinisi? bagaimana cara mendapatkan nilai yang diulang?part
akanundefined
jika elemen array telah ditetapkanundefined
secara eksplisit. Slot "Kosong" dari sebuah array (entri array yang belum pernah diberi nilai apa pun) dilewati oleh.forEach()
dan sebagian besar metode iterasi array lainnya..forEach()
dibutuhkan juga argumen keduathisArg
, yang bisa Anda gunakan sepertithis
di dalam callback. CATATAN: argumen ini.forEach
BUKAN argumen dari panggilan balik.this
argumen yang diteruskan sebagai argumen kedua.forEach()
, Anda harus meneruskan fungsi panggilan balik menggunakan sintaksfunction()
, karena menggunakan fungsi panah ES6() => {}
tidak mengikat konteks.Mari kita coba untuk membuatnya tetap sederhana dan membahas bagaimana cara kerjanya. Ini ada hubungannya dengan tipe variabel dan parameter fungsi.
Inilah kode yang sedang kita bicarakan:
Pertama, di sinilah Anda harus membaca tentang Array.prototype.forEach ():
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach
Kedua, mari kita bicara secara singkat tentang tipe nilai dalam JavaScript.
Primitif (undefined, null, String, Boolean, Number) menyimpan nilai aktual.
ex:
var x = 5;
Jenis Referensi (objek khusus) menyimpan lokasi memori objek.
ex:
var xObj = { x : 5 };
Dan ketiga, bagaimana parameter fungsi bekerja.
Dalam fungsi, parameter selalu dilewati oleh nilai.
Karena
arr
array dari String, ini adalah array objek primitif , yang berarti mereka disimpan oleh nilai.Jadi untuk kode Anda di atas, ini berarti bahwa setiap kali forEach () iterates,
part
sama dengan nilai yang sama denganarr[index]
, tetapi bukan objek yang sama .part = "four";
akan mengubahpart
variabel, tetapi akan pergiarr
sendiri.Kode berikut akan mengubah nilai yang Anda inginkan:
Sekarang jika array
arr
adalah array dari tipe referensi , kode berikut akan berfungsi karena tipe referensi menyimpan lokasi memori dari suatu objek, bukan objek yang sebenarnya.Berikut ini mengilustrasikan bahwa Anda dapat mengubah
part
untuk menunjuk ke objek baru sambil membiarkan objek disimpanarr
sendiri:sumber
In functions, parameters are always passed by value.
Bagaimana dengan contoh kedua?Array:
[1, 2, 3, 4]
Hasil:
["foo1", "foo2", "foo3", "foo4"]
Array.prototype.map()
Simpan array asliArray.prototype.forEach()
Timpa array aslisumber
let arr1 = ["1", 2, 3, 4]; arr1.map(function(v) { return "foo"+ v; }); console.log( arr );
Array.prototype.map () Jangan pernah Modifikasi array asli, forEach bermutasi.map
pasti dapat mengubah arraynya danforEach
, secara umum, tidak.Javascript diberikan nilai, dan yang pada dasarnya berarti
part
adalah salinan nilai dalam array.Untuk mengubah nilainya, akses array itu sendiri di loop Anda.
arr[index] = 'new value';
sumber
part
apakah itu disalin - walaupun Anda benar bahwa variabel bukan pointer, tetapi nilaiganti dengan indeks array.
sumber
Inilah jawaban yang mirip menggunakan
=>
fungsi gaya:memberikan hasilnya:
The
self
parameter tidak benar-benar diperlukan dengan fungsi panah gaya, sehinggajuga berfungsi.
sumber
Fungsi .forEach dapat memiliki fungsi callback (setiap elemen, elementIndex) Jadi pada dasarnya apa yang perlu Anda lakukan adalah:
Atau jika Anda ingin menyimpan array asli, Anda dapat membuat salinannya sebelum melakukan proses di atas. Untuk membuat salinan, Anda dapat menggunakan:
sumber
map()
bukanforEach()
.map()
beralih ke larik sumber dan mengembalikan larik baru yang berisi salinan asli [yang dimodifikasi]: larik sumber tidak berubah.Dengan metode objek Array Anda dapat memodifikasi konten Array namun dibandingkan dengan dasar untuk loop, metode ini tidak memiliki satu fungsi penting. Anda tidak dapat mengubah indeks saat dijalankan.
Misalnya jika Anda akan menghapus elemen saat ini dan menempatkannya ke posisi indeks lain dalam array yang sama Anda dapat dengan mudah melakukan ini. Jika Anda memindahkan elemen saat ini ke posisi sebelumnya tidak ada masalah di iterasi berikutnya Anda akan mendapatkan item berikutnya yang sama seolah-olah Anda tidak melakukan apa-apa.
Pertimbangkan kode ini tempat kami memindahkan item pada posisi indeks 5 ke posisi indeks 2 setelah indeks menghitung hingga 5.
Namun jika kita memindahkan elemen saat ini ke suatu tempat di luar posisi indeks saat ini, segalanya menjadi sedikit berantakan. Maka item berikutnya akan bergeser ke posisi item yang dipindahkan dan dalam iterasi berikutnya kita tidak akan dapat melihat atau mengevaluasinya.
Pertimbangkan kode ini di mana kami memindahkan item di posisi indeks 5 ke posisi indeks 7 setelah indeks menghitung hingga 5.
Jadi kita belum pernah bertemu 6 di loop. Biasanya dalam for loop Anda diharapkan mengurangi nilai indeks ketika Anda memindahkan item array ke depan sehingga indeks Anda tetap pada posisi yang sama di jalankan berikutnya dan Anda masih dapat mengevaluasi item yang bergeser ke tempat item yang dihapus. Ini tidak mungkin dengan metode array. Anda tidak dapat mengubah indeks. Periksa kode berikut
Seperti yang Anda lihat ketika kita mengurangi
i
itu tidak akan melanjutkan dari 5 tetapi 6, dari tempat itu ditinggalkan.Jadi ingatlah ini.
sumber
Untuk menambah atau menghapus elemen seluruhnya yang akan mengubah indeks, dengan cara memperpanjang zhujy_8833 saran slice () untuk beralih pada salinan, cukup hitung jumlah elemen yang telah Anda hapus atau tambahkan dan ubah indeks sesuai. Misalnya, untuk menghapus elemen:
Untuk memasukkan elemen sebelumnya:
Untuk memasukkan elemen setelah:
Untuk mengganti elemen:
Catatan: jika menerapkan sisipan 'sebelum' dan 'setelah', kode harus menangani sisipan 'sebelum' terlebih dahulu, sebaliknya tidak akan seperti yang diharapkan
sumber
Anda dapat mencoba ini jika ingin menimpa
sumber