JavaScript: Perbedaan antara .forEach () dan .map ()


116

Saya tahu ada banyak topik seperti ini. Dan saya tahu dasar-dasarnya: .forEach()beroperasi pada array asli dan .map()yang baru.

Dalam kasus saya:

function practice (i){
    return i+1;
};

var a = [ -1, 0, 1, 2, 3, 4, 5 ];
var b = [ 0 ];
var c = [ 0 ];
console.log(a);
b = a.forEach(practice);
console.log("=====");
console.log(a);
console.log(b);
c = a.map(practice);
console.log("=====");
console.log(a);
console.log(c);

Dan inilah keluarannya:

[ -1, 0, 1, 2, 3, 4, 5 ]
=====
[ -1, 0, 1, 2, 3, 4, 5 ]
undefined
=====
[ -1, 0, 1, 2, 3, 4, 5 ]
[ 0, 1, 2, 3, 4, 5, 6 ]

Saya tidak mengerti mengapa menggunakan practiceperubahan nilai bmenjadi undefined.
Maaf jika ini adalah pertanyaan konyol, tetapi saya cukup baru dalam bahasa ini dan jawaban yang saya temukan sejauh ini tidak memuaskan saya.


49
Sesederhana ini: .map mengembalikan array baru , sedangkan .forEach tidak mengembalikan apa pun . Pada dasarnya, jika Anda ingin mendapatkan bentuk modifikasi dari larik sebelumnya, Anda menggunakan .map, jika Anda tidak menginginkannya, Anda menggunakan .forEach.
user4642212


@ Xufox - Saya membahas topik ini sebelum membuat yang baru, tetapi jawabannya tidak memuaskan saya.
DzikiChrzan

Jangan hanya mengatakan itu tidak memuaskan Anda. Bagaimana tepatnya itu tidak menjawab pertanyaan Anda (sudahkah Anda membaca semua jawabannya?)? Apa pertanyaan spesifik Anda yang tidak tercakup oleh target duplikat yang diusulkan?
user4642212

@Xufox Pertanyaan itu berkaitan dengan fungsi yang diimplementasikan sendiri, dan sebenarnya bukan tentang fungsi ES5 standar.
aduk

Jawaban:


146

Mereka tidak satu dan sama. Izinkan saya menjelaskan perbedaannya.

forEach: Ini mengulangi daftar dan menerapkan beberapa operasi dengan efek samping untuk setiap anggota daftar (contoh: menyimpan setiap item daftar ke database)

map: Ini mengulangi daftar, mengubah setiap anggota daftar itu, dan mengembalikan daftar lain dengan ukuran yang sama dengan anggota yang diubah (contoh: mengubah daftar string menjadi huruf besar)

Referensi

Array.prototype.forEach () - JavaScript | MDN

Array.prototype.map () - JavaScript | MDN


5
Dan seperti yang dikatakan Xufox - .forEach tidak mengembalikan apa pun, itulah masalahnya. Terimakasih atas bantuannya! Saya akan menandai jawaban ini dalam 10 menit.
DzikiChrzan

1
peta daftar kembali dan forEach tidak. OK
Ashad Nasim

62
  • Array.forEach "Menjalankan fungsi yang disediakan sekali per elemen array."

  • Array.map "Membuat array baru dengan hasil memanggil fungsi yang disediakan pada setiap elemen dalam array ini."

Jadi, forEachsebenarnya tidak mengembalikan apa pun. Itu hanya memanggil fungsi untuk setiap elemen array dan kemudian selesai. Jadi, apa pun yang Anda kembalikan dalam fungsi yang dipanggil itu akan dibuang begitu saja.

Di sisi lain, mapakan sama memanggil fungsi untuk setiap elemen array tetapi alih-alih membuang nilai kembaliannya, ia akan menangkapnya dan membangun larik baru dari nilai-nilai yang dikembalikan tersebut.

Ini juga berarti bahwa Anda dapat menggunakan di mapmana pun Anda menggunakan forEachtetapi Anda tetap tidak boleh melakukannya sehingga Anda tidak mengumpulkan nilai pengembalian tanpa tujuan apa pun. Akan lebih efisien jika Anda tidak mengumpulkannya jika Anda tidak membutuhkannya.


Catatan: pada 2015, ini akan menjadi perdebatan bahwa forEachakan "lebih efisien" daripada mapterutama jika polyfill diperlukan untuk mendukung forEachpada browser yang lebih lama (IE8 atau 9). Anda tidak perlu menetapkan pengembalian mapuntuk apa pun; nilai kembali harus mendapatkan sampah yang dikumpulkan segera setelah mappengembalian ketika pengembalian maptidak ditetapkan.
cowbert

3
@cowbert Hanya karena ada sesuatu yang sampah dikumpulkan dengan segera, itu tidak berarti bahwa Anda tidak terkena alokasi yang diperlukan. Jadi forEachsecara konseptual akan tetap lebih efisien dan lebih cocok untuk tugas-tugas di mana Anda tidak perlu mengumpulkan hasil. Dan saya tidak tahu tentang Anda tetapi pada tahun 2015, saya tidak lagi mengembangkan untuk IE8 (yang juga tidak mendukung map); dan dukungan IE9 + forEach. Dan sebenarnya sebulan setelah jawaban saya, Microsoft mengakhiri dukungan untuk browser tersebut.
aduk

Apakah forEach dan map dijamin memproses elemen dalam urutan yang sama?
Quentin 2

1
@ Quentin2 Ya, juga, kedua fungsi tersebut sinkron, jadi mapdan forEachpanggilan hanya akan kembali setelah seluruh array telah di-loop dan callback telah dipanggil untuk masing-masing.
aduk

25
+ ---------------- + -------------------------------- ----- + --------------------------------------- +
| | foreach | peta |
+ ---------------- + -------------------------------- ----- + --------------------------------------- +
| Fungsi | Melakukan operasi tertentu pada setiap | Melakukan "transformasi" yang diberikan pada |
| | elemen dari array | "copy" dari setiap elemen |
+ ---------------- + -------------------------------- ----- + --------------------------------------- +
| Nilai kembali | Mengembalikan undefined | Mengembalikan array baru dengan tranformed |
| | | elemen meninggalkan kembali larik asli |
| | | tidak berubah |
+ ---------------- + -------------------------------- ----- + --------------------------------------- +
| Lebih disukai | Melakukan non-transformasi seperti | Memperoleh larik yang berisi keluaran |
| skenario penggunaan | memproses pada setiap elemen. | beberapa pemrosesan dilakukan pada setiap elemen |
| dan contoh | | dari larik. |
| | Misalnya, menyimpan semua elemen di | |
| | database | Misalnya, mendapatkan array |
| | | panjang setiap string di |
| | | larik |
+ ---------------- + -------------------------------- ----- + --------------------------------------- +

Harap edit postingan Anda dan tunjukkan teks yang sebenarnya, bukan gambar. Orang lain tidak dapat menyalin dan menempel dari gambar Anda, atau mencari di dalam gambar Anda, atau membantu meningkatkan konten teks pada gambar. Lihat di sini untuk detailnya. Terima kasih.
Pang

2
Ini dapat membantu Anda menggambar tabel seni ASCII: webapps.stackexchange.com/q/6700/126269
Pang


7

forEach: Jika Anda ingin melakukan tindakan pada elemen Array dan itu sama seperti yang Anda gunakan untuk perulangan. Hasil dari metode ini tidak memberi kita output beli hanya melalui elemen.

map: Jika Anda ingin melakukan tindakan pada elemen array dan juga ingin menyimpan output dari tindakan Anda ke dalam Array. Ini mirip dengan for loop dalam fungsi yang mengembalikan hasil setelah setiap iterasi.

Semoga ini membantu.


5

Perbedaannya terletak pada apa yang mereka kembalikan. Setelah eksekusi:

arr.map()

mengembalikan larik elemen yang dihasilkan dari fungsi yang diproses; sementara:

arr.forEach()

mengembalikan tidak ditentukan.


5

Analisis Kinerja Untuk loop bekerja lebih cepat daripada peta atau foreach karena jumlah elemen dalam array meningkat.

let array = [];
for (var i = 0; i < 20000000; i++) {
  array.push(i)
}

console.time('map');
array.map(num => {
  return num * 4;
});
console.timeEnd('map');


console.time('forEach');
array.forEach((num, index) => {
  return array[index] = num * 4;
});
console.timeEnd('forEach');

console.time('for');
for (i = 0; i < array.length; i++) {
  array[i] = array[i] * 2;

}
console.timeEnd('for');

Ini hasilnya di komputer saya:map: 1642ms forEach: 885ms for: 748ms
Flavio Vilante

2

Perbedaan antara Foreach & map:

Map () : Jika Anda menggunakan map maka map dapat mengembalikan larik baru dengan mengiterasi larik utama.

Foreach () : Jika Anda menggunakan Foreach maka itu tidak dapat mengembalikan apa pun untuk setiap array utama can iterating.

useFul link : gunakan link ini untuk memahami perbedaan

https://codeburst.io/javascript-map-vs-foreach-f38111822c0f


1

Satu hal yang perlu diperhatikan adalah bahwa foreach melompati nilai yang tidak diinisialisasi sementara map tidak.

var arr = [1, , 3];

arr.forEach(function(element) {
    console.log(element);
});
//Expected output: 1 3

console.log(arr.map(element => element));
//Expected output: [1, undefined, 3];

0

Perbedaan antara forEach () & map ()

forEach () hanya mengulang melalui elemen. Itu membuang nilai yang dikembalikan dan selalu mengembalikan yang tidak ditentukan. Hasil dari metode ini tidak memberi kita keluaran.

map () loop melalui elemen mengalokasikan memori dan menyimpan nilai yang dikembalikan dengan iterasi array utama

Contoh:

   var numbers = [2,3,5,7];

   var forEachNum = numbers.forEach(function(number){
      return number
   })
   console.log(forEachNum)
   //output undefined

   var mapNum = numbers.map(function(number){
      return number
   })
   console.log(mapNum)
   //output [2,3,5,7]

map () lebih cepat dari forEach ()



0

forEach () :

nilai kembali: tidak ditentukan

originalArray: diubah setelah pemanggilan metode

peta () :

nilai kembali: Array baru yang diisi dengan hasil pemanggilan fungsi yang disediakan pada setiap elemen dalam larik pemanggil

originalArray: tidak diubah setelah pemanggilan metode

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.