Apa cara terbaik untuk mengonversi:
['a','b','c']
untuk:
{
0: 'a',
1: 'b',
2: 'c'
}
javascript
arrays
node.js
object
David Hellsing
sumber
sumber
_.keyBy
(sebelumnya_.indexBy
): lodash.com/docs#keyBy_.toPlainObject
. Mis:var myObj = _.toPlainObject(myArr)
Jawaban:
ECMAScript 6 memperkenalkan polyfillable yang mudah
Object.assign
:The sendiri
length
properti dari array tidak akan disalin karena tidak enumerable.Selain itu, Anda dapat menggunakan sintaksis penyebaran ES6 untuk mencapai hasil yang sama:
sumber
{ ...[sortedArray]}
Dengan fungsi seperti ini:
Array Anda sudah lebih atau kurang hanyalah sebuah objek, tetapi array memiliki beberapa perilaku "menarik" dan khusus sehubungan dengan properti yang diberi nama integer. Di atas akan memberi Anda objek polos.
sunting oh juga Anda mungkin ingin memperhitungkan "lubang" dalam array:
Di runtime JavaScript modern, Anda dapat menggunakan
.reduce()
metode ini:Yang itu juga menghindari "lubang" dalam array, karena itulah cara
.reduce()
kerjanya.sumber
[]
) jika Anda tidak akan menggunakan kunci properti numerik dan properti "length".const obj = arr.reduce((obj, cur, i) => { return { ...obj, [i]: cur }; }, {});
const obj = arr.reduce((obj, cur, i) => ({ ...obj, [i]: cur }), {});
Anda bisa menggunakan akumulator alias
reduce
.Berikan objek kosong
{}
sebagai titik awal; lalu "tambah" objek itu secara bertahap. Di akhir iterasi,result
akan{"0": "a", "1": "b", "2": "c"}
Jika array Anda adalah satu set objek pasangan nilai kunci:
akan menghasilkan:
{a: 1, b: 2, c: 3}
Demi kelengkapan,
reduceRight
memungkinkan Anda untuk beralih di atas array Anda dalam urutan terbalik:akan menghasilkan:
{c:3, b:2, a:1}
Akumulator Anda dapat dari jenis apa pun untuk tujuan spesifik Anda. Misalnya untuk menukar kunci dan nilai objek Anda dalam sebuah array, lewati
[]
:akan menghasilkan:
[{1: "a"}, {2: "b"}, {3: "c"}]
Berbeda dengan itu
map
,reduce
mungkin tidak digunakan sebagai pemetaan 1-1. Anda memiliki kontrol penuh atas item yang ingin Anda sertakan atau kecualikan. Karena itureduce
memungkinkan Anda untuk mencapai apafilter
yang membuatnya, yangreduce
sangat fleksibel:akan menghasilkan:
[{2: "b"}, {3: "c"}]
Perhatian :
reduce
danObject.key
merupakan bagian dariECMA 5th edition
; Anda harus menyediakan polyfill untuk browser yang tidak mendukungnya (terutama IE8).Lihat implementasi standar oleh Mozilla .
sumber
Jika Anda menggunakan jquery:
sumber
{0: 'a', 1: 'b', 2: 'c'}
hasil yang diharapkan.Untuk kelengkapan, ECMAScript 2015 (ES6) menyebar. Akan membutuhkan transpiler (Babel) atau lingkungan yang menjalankan setidaknya ES6.
sumber
Saya mungkin akan menulis seperti ini (karena sangat jarang saya tidak akan memiliki perpustakaan underscorejs di tangan):
sumber
obj=_.extend({},a);
akan melakukan pekerjaan itu. Juga, jika Anda mengulangi melalui array saya katakan_.each
akan lebih tepat daripada_.map
. Secara keseluruhan, ini bukan jawaban yang baik untuk beberapa level.Berikut adalah metode O (1) ES2015 hanya untuk kelengkapan.
sumber
length
properti sendiri . (3) Objek masih berupa arrayArray.isArray(arr) === true
,. (4) Perilaku array khusus tidak dihapus, misalnyaarr.length = 0
menghapus semua indeks. (5) Karena itu, saya pikirObject.assign
jauh lebih baik .Array.isArray
kembalitrue
untuk "objek" di sini meskipuninstanceof Array
tidak ...Terkejut tidak melihat -
sumber
{ "first":"a", "second":"b","third":"c" }
dengan kunci yang diperbaiki - Saya mencari destructkita dapat menggunakan
Object.assign
danarray.reduce
berfungsi untuk mengubah Array ke Objek.sumber
Saya akhirnya menggunakan operator penyebaran objek, karena ini adalah bagian dari standar ECMAScript 2015 (ES6).
Jadikan biola sebagai contoh.
sumber
Cara mudah dalam JavaScript modern adalah dengan menggunakan
Object.assign()
yang tidak melakukan apa pun selain menyalin kunci: nilai dari satu objek ke objek lain. Dalam kasus kami,Array
donasikan properti ke yang baru{}
.sumber
O.assign
tetapi tidak ada penjelasan. Saat ini merusak array menjadi objek adalah cara ({...array}
)Untuk ES2016, sebarkan operator untuk objek. Catatan: Ini setelah ES6 dan karenanya transpiler perlu disesuaikan.
sumber
Lima tahun kemudian, ada cara yang baik :)
Object.assign
diperkenalkan di ECMAScript 2015.sumber
Menggunakan
javascript#forEach
satu dapat melakukan iniDengan ECMA6:
sumber
FWIW, satu pendekatan baru lainnya adalah menggunakan yang baru
Object.fromEntries
bersama denganObject.entries
sebagai berikut:... yang memungkinkan untuk menghindari penyimpanan item array jarang sebagai
undefined
ataunull
dan mempertahankan kunci non-indeks (misalnya, non-bilangan bulat positif / non-numerik).Seseorang mungkin ingin menambahkan
arr.length
, karena itu tidak termasuk:sumber
Anda dapat menggunakan operator spread
sumber
Jika Anda menggunakan ES6, Anda bisa menggunakan Object.assign dan operator spread
Jika Anda memiliki array bersarang suka
sumber
new Map([['key1', 'value1'], ['key2', 'value2']]);
Yang cepat dan kotor:
sumber
{0:"c", 1:"b", 2:"a"}
. Anda inginunshift
sebagai gantinyapop
atau (lebih baik) mulai dengani=arr.length-1
dan sebagai gantinya penurunan.l = arr.length
, dan kemudianwhile (l && (obj[--l] = arr.pop())){}
(saya menyadari ini sudah tua, tetapi mengapa tidak menyederhanakannya lebih jauh).Cepat dan kotor # 2:
sumber
i < a.length
alih-aliha[i]
.Pada Lodash 3.0.0 Anda dapat menggunakan _.toPlainObject
sumber
Inilah fungsi rekursif yang baru saja saya tulis. Sederhana dan berfungsi dengan baik.
Berikut ini sebuah contoh ( jsFiddle ):
Hasil:
sumber
['a' = '1', 'b' = '2', 'c' = '3']
dan menginginkannya{a: 1, b: 2, c: 3}
berfungsi sempurna.[docs]
atau lebih verbose
atau
yang terpendek dengan vanilla JS
beberapa contoh yang lebih kompleks
bahkan lebih pendek (dengan menggunakan
function(e) {console.log(e); return e;}
===(e)=>(console.log(e),e)
)[/ docs]
sumber
[/docs]
? Akan lebih bermanfaat untuk membuat potongan kode dieksekusi.Saya akan melakukan ini hanya dengan
Array.of()
. Array memiliki kemampuan untuk menggunakan konteksnya sebagai konstruktor.Jadi kita dapat mengikat
Array.of()
ke fungsi dan menghasilkan objek seperti array.Dengan memanfaatkan
Array.of()
satu bahkan dapat melakukan sub-class array .sumber
Jika Anda dapat menggunakan
Map
atauObject.assign
, itu sangat mudah.Buat sebuah array:
Di bawah ini membuat objek dengan indeks sebagai kunci:
Replikasi sama seperti di atas dengan Maps
Mengonversi ke objek berbasis indeks
{0 : 'css'}
dll ...Konversi ke objek berbasis nilai
{css : 'css is great'}
dll ...sumber
Metode sederhana dan kurang ajar dalam mengonversi Array item menjadi Objek dengan cepat
Kemudian menggunakannya seperti itu ...
Keluaran:
Memeriksa jenisnya:
DAN semuanya tidak akan lengkap jika tidak ada metode prototipe
Menggunakan seperti:
Keluaran:
* CATATAN bahwa tidak ada rutinitas penamaan, jadi jika Anda ingin memiliki nama tertentu, maka Anda harus terus menggunakan metode yang ada di bawah ini.
Metode yang lebih tua
Ini memungkinkan Anda untuk menghasilkan dari array objek dengan kunci yang Anda tentukan dalam urutan yang Anda inginkan.
console.log(">>> :" + result.onion);
akan menampilkan "paint", fungsi harus memiliki array dengan panjang yang sama atau Anda mendapatkan objek kosong.Berikut adalah metode yang diperbarui
sumber
Atau gunakan
sumber
ES5 - Solusi:
Menggunakan fungsi prototipe Array 'push' dan 'apply' Anda dapat mengisi objek dengan elemen array.
sumber
{ name: a, div :b, salary:c}
Lebih banyak browser yang didukung dan cara yang lebih fleksibel untuk melakukan itu menggunakan loop normal , sesuatu seperti:
Tetapi juga cara modern bisa menggunakan operator spread , seperti:
Atau Object assign :
Keduanya akan kembali :
sumber
Anda dapat menggunakan fungsi seperti ini:
Yang ini harus menangani array jarang lebih efisien.
sumber
Inilah solusi dalam naskah kopi
sumber
obj[i] = v for v,i in arr when v?