Apakah ada fungsi javascript yang setara dengan fungsi zip Python? Artinya, diberikan beberapa array dengan panjang yang sama membuat array pasangan.
Misalnya, jika saya memiliki tiga array yang terlihat seperti ini:
var array1 = [1, 2, 3];
var array2 = ['a','b','c'];
var array3 = [4, 5, 6];
Array output harus:
var output array:[[1,'a',4], [2,'b',5], [3,'c',6]]
forEach
,reduce
,map
,every
, dll Itu hanya kasus yangzip
tidak "membuat cut" (aflatMap
juga absen), bukan untuk pertimbangan kinerja - tapi Agar adil, .NET (3.5) tidak memiliki Zip pada Enumerable selama beberapa tahun! Pustaka 'fungsionalis' seperti garis bawah / lodash (lodash 3.x memiliki evaluasi urutan malas) akan menyediakan fungsi zip yang setara.Jawaban:
Pembaruan 2016:
Ini versi Ecmascript 6 yang lebih keren:
Ilustrasi equiv. ke Python {
zip(*args)
}:(dan FizzyTea menunjukkan bahwa ES6 memiliki sintaks argumen variadik, sehingga definisi fungsi berikut akan bertindak seperti python, tetapi lihat di bawah untuk penafian ... ini tidak akan menjadi kebalikannya sendiri sehingga
zip(zip(x))
tidak akan samax
; meskipun seperti yang ditunjukkan Matt Kramerzip(...zip(...x))==x
(seperti dalam python biasazip(*zip(*x))==x
))Definisi definisi alternatif. ke Python {
zip
}:(Harap perhatikan bahwa
...
sintaksis mungkin memiliki masalah kinerja saat ini, dan mungkin di masa depan, jadi jika Anda menggunakan jawaban kedua dengan argumen variadik, Anda mungkin ingin mengujinya.)Inilah oneliner:
Di atas mengasumsikan bahwa array memiliki ukuran yang sama, sebagaimana mestinya. Ini juga mengasumsikan Anda memasukkan dalam daftar argumen daftar, tidak seperti versi Python di mana daftar argumen variadic.Jika Anda ingin semua "fitur" ini, lihat di bawah. Hanya dibutuhkan sekitar 2 baris kode tambahan.
Berikut ini akan meniru
zip
perilaku Python pada kasus tepi di mana array tidak memiliki ukuran yang sama, diam-diam berpura-pura bahwa bagian array yang lebih lama tidak ada:Ini akan meniru
itertools.zip_longest
perilaku Python , menyisipkan diundefined
mana array tidak didefinisikan:Jika Anda menggunakan dua versi terakhir ini (variadic alias. Versi multi-argumen), maka zip tidak lagi kebalikannya sendiri. Untuk meniru
zip(*[...])
idiom dari Python, Anda harus melakukanzip.apply(this, [...])
ketika Anda ingin membalikkan fungsi zip atau jika Anda ingin memiliki jumlah daftar variabel yang sama sebagai input.tambahan :
Untuk membuat ini menangani semua iterable (misalnya dalam Python Anda dapat menggunakan
zip
pada string, rentang, objek peta, dll.), Anda bisa menentukan yang berikut:Namun jika Anda menulis
zip
dengan cara berikut , itu pun tidak perlu:Demo:
(Atau Anda dapat menggunakan
range(...)
fungsi gaya-Python jika Anda sudah menulisnya. Akhirnya Anda akan dapat menggunakan ECMAScript array array atau generator.)sumber
zip = (...rows) => [...rows[0]].map((_,c) => rows.map(row => row[c]));
zip(zip(x)) = x
, Anda masih dapat menikmati ituzip(...zip(...x)) = x
.const the_longest_array_length = Math.max(...(arrays.map(array => array.length)));
Lihat perpustakaan Garis Bawah .
- Katakan orang yang membuatnya
Saya baru-baru ini mulai menggunakannya khusus untuk
zip()
fungsi dan telah meninggalkan kesan pertama yang bagus. Saya menggunakan jQuery dan CoffeeScript, dan itu hanya berjalan dengan mereka. Garis bawah mengambil tepat di tempat mereka pergi dan sejauh ini tidak mengecewakan saya. Oh, omong-omong, itu hanya 3kb yang diperkecil.Saksikan berikut ini:
sumber
Selain jawaban ninjagecko yang luar biasa dan komprehensif, yang diperlukan untuk meng-zip dua array-JS menjadi "tuple-mimic" adalah:
Penjelasan:
Karena Javascript tidak memiliki
tuples
tipe, fungsi untuk tupel, daftar, dan set bukanlah prioritas utama dalam spesifikasi bahasa.Jika tidak, perilaku serupa dapat diakses secara langsung melalui peta Array di JS> 1.6 . (
map
sebenarnya sering diterapkan oleh pembuat mesin JS di banyak> mesin JS 1.4, meskipun tidak ditentukan).Perbedaan utama Python
zip
,izip
, ... hasil darimap
gaya fungsional 's, karenamap
memerlukan fungsi-argumen. Selain itu itu adalah fungsi dariArray
-instance. Satu dapat menggunakanArray.prototype.map
sebagai gantinya, jika deklarasi tambahan untuk input adalah masalah.Contoh:
Hasil:
Kinerja terkait:
Menggunakan
map
over-for
loop:Lihat: Apa cara penggabungan yang paling efisien [1,2] dan [7,8] menjadi [[1,7], [2,8]]
Catatan: tipe dasar seperti
false
danundefined
tidak memiliki hierarki objek prototipal dan karenanya tidak memaparkantoString
fungsi. Karenanya ini ditampilkan sebagai kosong dalam output.Karena
parseInt
argumen kedua adalah basis / angka radix, yang digunakan untuk mengkonversi angka, dan karenamap
meneruskan indeks sebagai argumen kedua ke fungsi argumennya, fungsi wrapper digunakan.sumber
aIn.map(function(e, i) {return [e, aOut[i]];})
Apa yang salah?Array.prototype.map
seharusnya sudahArray.prototype.map.call
, tetap jawabannya.Contoh ES6 modern dengan generator:
Pertama, kita mendapatkan daftar iterables sebagai
iterators
. Ini biasanya terjadi secara transparan, tetapi di sini kita melakukannya secara eksplisit, ketika kita menghasilkan langkah demi langkah sampai salah satu dari mereka kelelahan. Kami memeriksa apakah ada hasil (menggunakan.some()
metode) dalam array yang diberikan telah habis, dan jika demikian, kami mematahkan loop while.sumber
Di samping fungsi-fungsi lain yang mirip dengan Python,
pythonic
menawarkan sebuahzip
fungsi, dengan manfaat tambahan untuk mengembalikan malas yang dievaluasiIterator
, mirip dengan perilaku rekan Python-nya :Pengungkapan Saya adalah penulis dan pengelola Pythonic
sumber
Python memiliki dua fungsi: zip dan itertools.zip_longest. Implementasi pada JS / ES6 adalah seperti ini:
Implementasi zip Python`s di JS / ES6
Hasil:
Implementasi zip_longest Python`s di JS / ES6
( https://docs.python.org/3.5/library/itertools.html?highlight=zip_longest#itertools.zip_longest )
Hasil:
sumber
Anda dapat membuat fungsi utilitas dengan menggunakan ES6.
Namun, dalam panjang solusi di atas array pertama mendefinisikan panjang array output.
Inilah solusi di mana Anda memiliki kendali lebih besar terhadapnya. Agak rumit tapi sepadan.
sumber
1. Modul NPM:
zip-array
Saya menemukan modul npm yang dapat digunakan sebagai versi javascript python
zip
:zip-array - Javascript yang setara dengan fungsi zip Python. Menggabungkan nilai-nilai dari masing-masing array.
https://www.npmjs.com/package/zip-array
2.
tf.data.zip()
di Tensorflow.jsPilihan alternatif lain adalah untuk pengguna Tensorflow.js: jika Anda memerlukan
zip
fungsi dalam python untuk bekerja dengan dataset tensorflow dalam Javascript, Anda dapat menggunakantf.data.zip()
Tensorflow.js.tf.data.zip () di Tensorflow.js didokumentasikan di sini
sumber
Bukan bawaan untuk Javascript itu sendiri. Beberapa kerangka kerja Javascript umum (seperti Prototipe) menyediakan implementasi, atau Anda dapat menulis sendiri.
sumber
Seperti @Brandon, saya sarankan Menggarisbawahi 's zip fungsi. Namun, ini bertindak seperti
zip_longest
, menambahkanundefined
nilai yang diperlukan untuk mengembalikan sesuatu yang panjang dari input terpanjang.Saya menggunakan
mixin
metode untuk memperluas garis bawah denganzipShortest
, yang bertindak seperti Pythonzip
, berdasarkan dari sumber perpustakaan itu sendirizip
.Anda dapat menambahkan berikut ini ke kode JS umum Anda dan kemudian menyebutnya seolah-olah itu bagian dari garis bawah:
_.zipShortest([1,2,3], ['a'])
mengembalikan[[1, 'a']]
, misalnya.sumber
Anda bisa mengurangi larik array dan memetakan array baru dengan mengambil hasil indeks array dalam.
sumber
Variasi dari solusi generator malas :
Dan ini adalah idiom klasik "n-group" python
zip(*[iter(a)]*n)
:sumber
The MochiKit perpustakaan menyediakan ini dan banyak lainnya Python-seperti fungsi. pengembang Mochikit juga merupakan penggemar Python, sehingga memiliki gaya umum Python, dan juga membungkus panggilan async dalam kerangka kerja yang memutar.
sumber
Saya mencoba ini di JS murni bertanya-tanya bagaimana plugin yang diposting di atas menyelesaikan pekerjaan. Inilah hasil saya. Saya akan membuka ini dengan mengatakan bahwa saya tidak tahu seberapa stabil ini di IE dan sejenisnya. Itu hanya mockup cepat.
Ini bukan antipeluru, tapi masih menarik.
sumber
console.log
kealert
.document.write()
jsfiddle.net/PyTWw/5Ini memotong garis dari jawaban berbasis iterator Ddi :
sumber
Jika Anda baik-baik saja dengan ES6:
sumber