Jika saya memiliki array string, saya bisa menggunakan .join()
metode ini untuk mendapatkan string tunggal, dengan setiap elemen dipisahkan dengan koma, seperti:
["Joe", "Kevin", "Peter"].join(", ") // => "Joe, Kevin, Peter"
Saya memiliki berbagai objek, dan saya ingin melakukan operasi serupa pada nilai yang ada di dalamnya; jadi dari
[
{name: "Joe", age: 22},
{name: "Kevin", age: 24},
{name: "Peter", age: 21}
]
melakukan join
metode hanya pada name
atribut, untuk mencapai hasil yang sama seperti sebelumnya.
Saat ini saya memiliki fungsi berikut:
function joinObj(a, attr){
var out = [];
for (var i = 0; i < a.length; i++){
out.push(a[i][attr]);
}
return out.join(", ");
}
Tidak ada yang salah dengan kode itu, ia berfungsi, tetapi tiba-tiba saya beralih dari garis kode yang ringkas dan ringkas ke fungsi yang sangat penting. Apakah ada cara penulisan yang lebih ringkas dan idealnya lebih fungsional?
javascript
arrays
object
jackweirdy
sumber
sumber
" ,".join([i.name for i in a])
users.map(x => x.name).join(', ');
.Jawaban:
Jika Anda ingin memetakan objek ke sesuatu (dalam hal ini properti). Saya pikir
Array.prototype.map
adalah apa yang Anda cari jika Anda ingin kode secara fungsional.Dalam JavaScript modern:
(biola)
Jika Anda ingin mendukung browser yang lebih lama, yang tidak sesuai dengan ES5, Anda dapat mengacaukannya (ada polyfill pada halaman MDN di atas). Alternatif lain adalah menggunakan
pluck
metode underscorejs :sumber
[x.name for x of users]
(spec wiki.ecmascript.org/doku.php?id=harmony:array_comprehensions ). Layak disebutkan bahwa sama seperti menggunakan peta / perkecil / filter tidak terlalu 'pythonic' cara lain mungkin berlaku dalam JavaScript. CoffeeScript keren dengan mereka meskipun coffeescript.org .users.map((obj) -> obj.name).join(', ')
Nah, Anda selalu dapat mengganti
toString
metode objek Anda:sumber
toString
metode semua item, menggunakan for-loop. Atau Anda bisa menggunakan pendekatan ini ketika berhadapan dengan fungsi konstruktor, dengan menambahkan satutoString
metode keprototype
properti untuk konstruktor. Namun contoh ini seharusnya hanya menunjukkan konsep dasar.Saya juga menemukan menggunakan
reduce
metode ini, seperti ini tampilannya:The
(a.name || a)
begitu elemen pertama diperlakukan dengan benar, tapi sisa (di manaa
adalah string, dan sebagainyaa.name
tidak terdefinisi) tidak diperlakukan sebagai objek.Sunting: Saya sekarang telah refactored lebih lanjut untuk ini:
yang saya yakini lebih bersih seperti
a
selalu berupa string,b
selalu merupakan objek (karena penggunaan parameter initialValue opsional dalamreduce
)Sunting 6 bulan kemudian: Oh, apa yang saya pikirkan. "pembersih". Saya sudah membuat marah kode Dewa.
sumber
reduce
tidak didukung secara luasmap
(yang aneh, mengingat mereka adalah saudara perempuan) jadi saya masih menggunakan jawaban Anda :)Saya tidak tahu apakah ada cara yang lebih mudah untuk melakukannya tanpa menggunakan perpustakaan eksternal, tapi saya pribadi suka underscore.js yang memiliki banyak utilitas untuk berurusan dengan array, koleksi, dll.
Dengan garis bawah Anda dapat melakukan ini dengan mudah dengan satu baris kode:
_.pluck(arr, 'name').join(', ')
sumber
arr
array Anda, tentu saja)Pada node atau ES6 +:
sumber
katakanlah array objek direferensikan oleh variabel
users
Jika ES6 dapat digunakan maka solusi termudah adalah:
Jika tidak, dan lodash dapat digunakan:
sumber
Jika objek dan kunci dinamis:
"applications\":{\"1\":\"Element1\",\"2\":\"Element2\"}
sumber
Utas lama yang saya tahu tetapi masih sangat relevan bagi siapa saja yang menemukan ini.
Array.map telah disarankan di sini yang merupakan metode luar biasa yang saya gunakan sepanjang waktu. Array.reduce juga disebutkan ...
Saya pribadi akan menggunakan Array.reduce untuk use case ini. Mengapa? Meskipun kode menjadi sedikit kurang bersih / jernih. Ini jauh lebih efisien daripada memipipkan fungsi peta ke gabungan.
Alasan untuk ini adalah karena Array.map harus mengulang setiap elemen untuk mengembalikan array baru dengan semua nama objek dalam array. Array.join kemudian lewati isi array untuk melakukan join.
Anda dapat meningkatkan keterbacaan jackweirdys mengurangi jawaban dengan menggunakan literal templat untuk mendapatkan kode pada satu baris. "Didukung di semua browser modern juga"
sumber
tidak yakin, tetapi semua jawaban ini berfungsi tetapi tidak optimal karena melakukan dua pemindaian dan Anda dapat melakukan ini dalam satu pemindaian. Meskipun O (2n) dianggap O (n) selalu lebih baik untuk memiliki O (n) yang sebenarnya.
Ini mungkin terlihat seperti jadul, tetapi memungkinkan saya untuk melakukan thig seperti ini:
sumber
coba ini
sumber
name
atributnya. (a[i].name
Tidak tidak menggunakan fungsi ini Andaname
argumen, itu setara dengana[i]['name']
.)