Saya mencari metode penyisipan array JavaScript, dengan gaya:
arr.insert(index, item)
Lebih disukai di jQuery, tetapi implementasi JavaScript akan dilakukan pada saat ini.
javascript
jquery
arrays
tags2k
sumber
sumber
Jawaban:
Yang Anda inginkan adalah
splice
fungsi pada objek array asli.arr.splice(index, 0, item);
akan menyisipkanitem
kearr
dalam indeks yang ditentukan (menghapus0
item terlebih dahulu, yaitu hanya sisipan).Dalam contoh ini kita akan membuat array dan menambahkan elemen ke dalam indeks 2:
sumber
arr.splice(2,3)
akan menghapus 3 elemen mulai dari indeks 2. Tanpa melewati 3 .... Nth parameter tidak ada yang dimasukkan. Jadi namanyainsert()
juga tidak adil.Anda dapat menerapkan
Array.insert
metode ini dengan melakukan ini:Maka Anda bisa menggunakannya seperti:
sumber
Array.prototype.insert = function (index, items) { this.splice.apply(this, [index, 0].concat(items)); }
Selain sambatan, Anda dapat menggunakan pendekatan ini yang tidak akan mengubah array asli, tetapi akan membuat array baru dengan item yang ditambahkan. Anda biasanya harus menghindari mutasi jika memungkinkan. Saya menggunakan operator spread ES6 di sini.
Ini dapat digunakan untuk menambahkan lebih dari satu item dengan sedikit mengubah fungsi untuk menggunakan operator lainnya untuk item baru, dan menyebarkannya di hasil yang dikembalikan juga
sumber
insert
Metode susunan khusus1. Dengan beberapa argumen dan dukungan rantai
Itu dapat menyisipkan beberapa elemen (seperti yang asli
splice
lakukan) dan mendukung rantai:2. Dengan argumen tipe array, penggabungan dan dukungan chaining
Itu dapat menggabungkan array dari argumen dengan array yang diberikan dan juga mendukung rantai:
DEMO: http://jsfiddle.net/UPphH/
sumber
["b", "X", "Y", "Z", "c"]
. Kenapa tidak"d"
termasuk? Tampak bagi saya bahwa jika Anda menempatkan 6 sebagai parameter keduaslice()
dan ada 6 elemen dalam array mulai dari indeks yang ditentukan, maka Anda harus mendapatkan semua 6 elemen dalam nilai kembali. (Doc mengatakanhowMany
untuk parameter itu.) Developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…["a", "b", "c", "d"].insert(2, "X", "Y", "Z").slice(3, 3);
=>[ ]
slice
metode dan tidaksplice
, yang Anda maksudkan di komentar. Parameter keduaslice
(bernamaend
) adalah indeks berbasis nol untuk mengakhiri ekstraksi.slice
ekstrak hingga tetapi tidak termasukend
. Oleh karena itu setelahinsert
Anda memiliki["a", "b", "X", "Y", "Z", "c", "d"]
, dari manaslice
ekstrak elemen dengan indeks dari1
hingga6
, yaitu dari"b"
ke"d"
tetapi tidak termasuk"d"
. Apakah masuk akal?Jika Anda ingin memasukkan beberapa elemen ke dalam array sekaligus, periksa jawaban Stack Overflow ini: Cara yang lebih baik untuk memisahkan array ke dalam array di javascript
Juga ada beberapa fungsi untuk menggambarkan kedua contoh:
Akhirnya di sini adalah jsFiddle sehingga Anda dapat melihatnya sendiri: http://jsfiddle.net/luisperezphd/Wc8aS/
Dan ini adalah bagaimana Anda menggunakan fungsinya:
sumber
Untuk tujuan pemrograman fungsional dan rantai, penemuan
Array.prototype.insert()
sangat penting. Sebenarnya sambungan bisa sempurna jika mengembalikan array bermutasi, bukan array kosong yang sama sekali tidak berarti. Jadi beginiBaiklah ok di atas dengan yang
Array.prototype.splice()
mengubah array asli dan beberapa mungkin mengeluh seperti "Anda tidak boleh memodifikasi apa yang bukan milik Anda" dan itu mungkin ternyata benar juga. Jadi untuk kesejahteraan publik saya ingin memberikan yang lainArray.prototype.insert()
yang tidak mengubah array asli. Ini dia;sumber
splice
mengubah array asli, saya tidak berpikir "pemrograman fungsional yang tepat" berada di sekitarsplice
.Saya sarankan menggunakan JavaScript murni dalam hal ini, juga tidak ada metode penyisipan dalam JavaScript, tetapi kami memiliki metode yang merupakan metode Array bawaan yang berfungsi untuk Anda, ini disebut splice ...
Mari kita lihat apa sambatan () ...
OK, bayangkan kita memiliki array ini di bawah ini:
Kami dapat menghapus
3
seperti ini:Ini akan mengembalikan 3, tetapi jika kami memeriksa arr sekarang, kami memiliki:
Sejauh ini, sangat bagus, tetapi bagaimana kita bisa menambahkan elemen baru ke array menggunakan splice? Mari kita kembalikan 3 di arr ...
Mari kita lihat apa yang telah kita lakukan ...
Kami menggunakan sambungan lagi, tapi kali ini untuk argumen kedua, kami melewati 0 , berarti kami ingin menghapus tidak ada item, tetapi pada saat yang sama, kami menambahkan argumen ketiga yang 3 yang akan ditambahkan pada indeks kedua ...
Anda harus sadar, bahwa kita dapat menghapus dan menambahkan pada saat yang sama, misalnya sekarang kita dapat melakukan:
Yang akan menghapus 2 item pada indeks 2, kemudian menambahkan 3 pada indeks 2 dan hasilnya adalah:
Ini menunjukkan bagaimana setiap item dalam sambungan bekerja:
sumber
Tambahkan Elemen Tunggal pada indeks tertentu
Tambahkan Beberapa Elemen pada indeks tertentu
sumber
arrName[3] = 'newName1';
akan menambahkan jika array hanya memiliki 3 elemen. Jika ada elemen dalam indeks 3, ini akan diganti. Jika Anda ingin menambahkan di akhir, lebih baik menggunakanarrName.push('newName1');
Solusi lain yang mungkin, dengan penggunaan
Array#reduce
.sumber
Berikut ini dua cara:
ATAU
sumber
Meskipun ini sudah dijawab, saya menambahkan catatan ini untuk pendekatan alternatif.
Saya ingin menempatkan sejumlah item yang diketahui ke dalam array, ke posisi tertentu, karena item tersebut berasal dari "array asosiatif" (yaitu objek) yang menurut definisi tidak dijamin dalam urutan yang diurutkan. Saya ingin array yang dihasilkan menjadi array objek, tetapi objek berada dalam urutan tertentu dalam array karena array menjamin pesanan mereka. Jadi saya melakukan ini.
Pertama objek sumber, string JSONB diambil dari PostgreSQL. Saya ingin memilikinya diurutkan berdasarkan properti "order" di setiap objek anak.
Karena jumlah node dalam objek diketahui, pertama-tama saya membuat array dengan panjang yang ditentukan:
Dan kemudian iterate objek, menempatkan objek sementara yang baru dibuat ke lokasi yang diinginkan dalam array tanpa benar-benar terjadi "penyortiran".
sumber
Siapa pun yang masih memiliki masalah dengan yang satu ini dan telah mencoba semua opsi di atas dan tidak pernah mendapatkannya. Saya membagikan solusi saya, ini untuk mempertimbangkan bahwa Anda tidak ingin menyatakan secara eksplisit properti objek Anda vs array.
Ini adalah kombinasi dari pengulangan array referensi dan membandingkannya dengan objek yang ingin Anda periksa, konversikan keduanya menjadi string kemudian iterasi jika cocok. Maka Anda bisa menghitung. Ini bisa diperbaiki tetapi di sinilah saya menetap. Semoga ini membantu.
sumber
Mengambil keuntungan dari metode pengurangan sebagai berikut:
Jadi dengan cara ini kita dapat mengembalikan array baru (akan menjadi cara fungsional yang keren - jauh lebih baik daripada menggunakan push atau splice) dengan elemen yang dimasukkan pada indeks, dan jika indeks lebih besar dari panjang array maka akan dimasukkan pada akhirnya.
sumber
Array#splice()
adalah cara untuk pergi, kecuali jika Anda benar-benar ingin menghindari mutasi array. Diberikan 2 arrayarr1
danarr2
, inilah cara Anda memasukkan kontenarr2
ke dalamarr1
setelah elemen pertama:Jika Anda khawatir tentang mutasi array (misalnya, jika menggunakan Immutable.js), Anda dapat menggunakan
slice()
, bukannya dikacaukan dengansplice()
dengan a'p'
.sumber
Saya mencoba ini dan berfungsi baik!
Indeks adalah posisi di mana Anda ingin menyisipkan atau menghapus elemen. 0 yaitu parameter kedua mendefinisikan jumlah elemen dari indeks yang akan dihapus item adalah entri baru yang ingin Anda buat dalam array. Itu bisa satu atau lebih dari satu.
sumber
Inilah fungsi kerja yang saya gunakan di salah satu aplikasi saya.
Ini memeriksa apakah item keluar
Dan kemudian saya menyebutnya di bawah ini.
sumber
Sedikit utas yang lebih tua, tapi saya harus setuju dengan Redu di atas karena sambungan pasti memiliki sedikit antarmuka yang membingungkan. Dan respon yang diberikan oleh cdbajorin bahwa "ia hanya mengembalikan array kosong ketika parameter kedua adalah 0. Jika lebih besar dari 0, ia mengembalikan item yang dihapus dari array" adalah, sementara akurat, membuktikan titik. Maksud fungsinya adalah untuk menyambungkan atau seperti yang dikatakan sebelumnya oleh Jakob Keller, "untuk bergabung atau terhubung, juga untuk mengubah. Anda memiliki array yang sudah ada yang sekarang Anda ubah yang akan melibatkan penambahan atau penghapusan elemen ...." Mengingat, nilai kembali elemen, jika ada, yang dihapus adalah canggung di terbaik. Dan saya 100% setuju bahwa metode ini bisa lebih cocok untuk rantai jika telah mengembalikan apa yang tampak alami, array baru dengan elemen yang ditambahkan ditambahkan. Kemudian Anda bisa melakukan hal-hal seperti ["19", "17"]. Splice (1,0, "18"). Join ("...") atau apa pun yang Anda suka dengan array yang dikembalikan. Fakta bahwa ia mengembalikan apa yang dihapus adalah IMHO hanya omong kosong. Jika maksud dari metode ini adalah untuk "memotong sekumpulan elemen" dan itu hanya niat, mungkin. Sepertinya jika saya tidak tahu apa yang sudah saya hilangkan, saya mungkin punya sedikit alasan untuk menghilangkan elemen-elemen itu, bukan? Akan lebih baik jika berperilaku seperti concat, memetakan, mengurangi, mengiris, dll di mana array baru dibuat dari array yang ada daripada bermutasi array yang ada. Itu semua tidak dapat dilacak, dan itu adalah masalah yang signifikan. Ini agak umum untuk manipulasi array rantai. Sepertinya bahasa perlu menuju ke satu atau ke arah lain dan mencoba untuk berpegang teguh pada itu sebanyak mungkin. Javascript menjadi fungsional dan kurang deklaratif, sepertinya penyimpangan aneh dari norma.
sumber
Performa
Hari ini (2020.04.24) Saya melakukan tes untuk solusi yang dipilih untuk array besar dan kecil. Saya mengujinya pada MacOs High Sierra 10.13.6 di Chrome 81.0, Safari 13.1, Firefox 75.0.
Kesimpulan
Untuk semua browser
slice
danreduce
(D, E, F) biasanya 10x-100x lebih cepat daripada solusi in-placesplice
(AI, BI, CI) tercepat (kadang-kadang ~ 100x - tetapi itu tergantung dari ukuran array)Detail
Pengujian dibagi menjadi dua kelompok: solusi in-place (AI, BI, CI) dan solusi non-in-place (D, E, F) dan dilakukan untuk dua kasus
Kode yang diuji disajikan dalam cuplikan di bawah ini
Tampilkan cuplikan kode
Contoh hasil untuk array kecil pada chrome ada di bawah ini
sumber