Bagaimana saya bisa mendorong ke array jika tidak ada nilai? Ini array saya:
[
{ name: "tom", text: "tasty" },
{ name: "tom", text: "tasty" },
{ name: "tom", text: "tasty" },
{ name: "tom", text: "tasty" },
{ name: "tom", text: "tasty" }
]
Jika saya mencoba untuk mendorong lagi ke dalam array dengan salah satu name: "tom"
atau text: "tasty"
, saya tidak ingin sesuatu terjadi ... tetapi jika tidak ada yang ada di sana maka saya ingin.push()
Bagaimana saya bisa melakukan ini?
javascript
arrays
json
push
not-exists
tarnfeld
sumber
sumber
Jawaban:
Anda dapat memperluas prototipe Array dengan metode khusus:
sumber
Array.findIndex()
adalah fungsi JS bawaan yang akan mencapai hal yang sama seperti kode Anda.Untuk larik string (tetapi bukan larik objek), Anda dapat memeriksa apakah suatu item ada dengan memanggil
.indexOf()
dan jika tidak maka masukkan saja item ke dalam array:sumber
if (a.indexOf({ name: "tom", text: "tasty" })!=-1) a.push({ name: "tom", text: "tasty" })
dua kali. Ini akan menambahkan objek 'mirip' dua kali.Sangat mudah untuk dilakukan menggunakan
Array.findIndex
fungsi, yang mengambil fungsi sebagai argumen:sumber
http://api.jquery.com/jQuery.unique/
Anda mungkin tertarik pada makeArray juga
Contoh sebelumnya adalah yang terbaik dalam mengatakan bahwa periksa apakah ada sebelum mendorong. Saya melihat di belakang juga menyatakan Anda dapat mendeklarasikannya sebagai bagian dari prototipe (saya kira itu Kelas Ekstensi), jadi tidak ada peningkatan besar di bawah ini.
Kecuali saya tidak yakin apakah indexOf adalah rute yang lebih cepat daripada di Array? mungkin.
sumber
Note that this only works on arrays of DOM elements, not strings or numbers.
Juga, indexOf tidak berfungsi di IE8 :(Gunakan perpustakaan js seperti underscore.js karena alasan ini persis. Gunakan: gabungan: Menghitung gabungan dari array yang lewat: daftar item unik, secara berurutan, yang ada di satu atau lebih dari array.
sumber
Seperti ini?
Dengan objek
sumber
array.find
adalah ide yang buruk karena mencari seluruh array. GunakanfindIndex
, yang hanya mencari sampai kemunculan pertama.Saya tahu ini adalah pertanyaan yang sangat lama, tetapi jika Anda menggunakan ES6 Anda dapat menggunakan versi yang sangat kecil:
Sangat mudah, pada awalnya tambahkan filter yang menghapus item - jika sudah ada, dan kemudian tambahkan melalui sebuah concat.
Ini adalah contoh yang lebih realistis:
Jika Anda array berisi objek, Anda bisa mengadaptasi fungsi filter seperti ini:
sumber
Dorong secara dinamis
Dalam metode sederhana
Jika array hanya berisi tipe primitif / array sederhana
sumber
Saya sarankan Anda menggunakan Set ,
Set hanya memungkinkan entri unik, yang secara otomatis menyelesaikan masalah Anda.
Set dapat dinyatakan seperti ini:
sumber
Array.push
, jadiSet.add
sama dengan itu.Kode mudah, jika 'indexOf' mengembalikan '-1' itu berarti elemen tidak ada di dalam array maka kondisi '=== -1' mengambil true / false.
Operator '&&' berarti 'dan', jadi jika kondisi pertama benar, kami dorong ke array.
sumber
Tidak yakin tentang kecepatan, tetapi
stringification
+indexOf
adalah pendekatan sederhana. Mulailah dengan mengubah array Anda menjadi string:Kemudian untuk serangkaian pasangan atribut-nilai yang dapat Anda gunakan:
Menemukan seluruh objek lebih mudah:
sumber
Jika Anda membutuhkan sesuatu yang sederhana tanpa ingin memperpanjang prototipe Array:
sumber
Jika ada yang memiliki persyaratan yang tidak terlalu rumit, inilah adaptasi saya atas jawaban untuk larik string sederhana:
Pembaruan: Ganti indexOf dan trim dengan alternatif jQuery untuk kompatibilitas IE8
sumber
Saya menggunakan peta dan mengurangi untuk melakukan ini dalam kasus di mana Anda ingin mencari dengan properti tertentu dari suatu objek, berguna karena melakukan persamaan objek langsung akan sering gagal.
sumber
Contoh singkat:
sumber
a adalah array dari objek yang Anda miliki
sumber
Anda dapat menggunakan metode findIndex dengan fungsi panggilan balik dan parameter "ini" -nya.
Catatan: browser lama tidak tahu findIndex tetapi polyfill tersedia.
Kode sampel (perhatikan bahwa dalam pertanyaan asli, objek baru didorong hanya jika tidak ada datanya dalam objek yang didorong sebelumnya):
sumber
Saya kira saya sudah terlambat untuk menjawab di sini, tetapi inilah yang akhirnya saya dapatkan untuk manajer email yang saya tulis. Pekerjaan itu yang saya butuhkan.
sumber
Ini berfungsi untuk perbandingan objek. Dalam beberapa kasus, Anda mungkin memiliki banyak bidang untuk dibandingkan. Cukup loop array dan panggil fungsi ini dengan item yang ada dan item baru.
sumber
Di sini Anda memiliki cara untuk melakukannya dalam satu baris untuk dua array:
sumber
Anda dapat menggunakan jQuery grep dan mendorong jika tidak ada hasil: http://api.jquery.com/jQuery.grep/
Ini pada dasarnya solusi yang sama seperti dalam solusi "memperluas prototipe", tetapi tanpa memperluas (atau mencemari) prototipe.
sumber
Anda dapat memeriksa array menggunakan foreach dan kemudian pop item jika ada, jika tidak tambahkan item baru ...
sampel NewItemValue & submitFields adalah pasangan kunci, nilai
sumber