Konversi Array ke Objek

514

Apa cara terbaik untuk mengonversi:

['a','b','c']

untuk:

{
  0: 'a',
  1: 'b',
  2: 'c'
}
David Hellsing
sumber
3
Mungkin yang dia butuhkan adalah kode untuk mengetik bebek agar tidak berpikir bahwa itu adalah contoh Array
Pointy
6
Nilainya menunjukkan bahwa array Javascript adalah objek.
Spudley
Jika ada orang lain yang mencari solusi Lodash, pertimbangkan _.keyBy(sebelumnya _.indexBy): lodash.com/docs#keyBy
2540625
Ini agak membingungkan karena array sudah objek, tapi saya kira maksud pertanyaannya adalah mengubah objek eksotis array menjadi objek biasa .
Oriol
1
Cara sederhana untuk melakukan ini dengan Lodash adalah _.toPlainObject. Mis:var myObj = _.toPlainObject(myArr)
Julian Soro

Jawaban:

473

ECMAScript 6 memperkenalkan polyfillable yang mudah Object.assign:

The Object.assign()metode yang digunakan untuk menyalin nilai dari semua properti enumerable sendiri dari satu atau lebih sumber objek ke objek target. Ini akan mengembalikan objek target.

Object.assign({}, ['a','b','c']); // {0:"a", 1:"b", 2:"c"}

The sendiri lengthproperti dari array tidak akan disalin karena tidak enumerable.

Selain itu, Anda dapat menggunakan sintaksis penyebaran ES6 untuk mencapai hasil yang sama:

{ ...['a', 'b', 'c'] }
Oriol
sumber
Hanya ingin menunjukkan - jika Anda sudah memiliki array properti yang diurutkan dari objek asli, menggunakan operator spread adalah apa yang akan mengubah array itu langsung menjadi objek baru:{ ...[sortedArray]}
HappyHands31
Oriol, apakah ada cara untuk mengatur kunci tetap, bukan 0 & 1?
Menai Ala Eddine
488

Dengan fungsi seperti ini:

function toObject(arr) {
  var rv = {};
  for (var i = 0; i < arr.length; ++i)
    rv[i] = arr[i];
  return rv;
}

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:

function toObject(arr) {
  var rv = {};
  for (var i = 0; i < arr.length; ++i)
    if (arr[i] !== undefined) rv[i] = arr[i];
  return rv;
}

Di runtime JavaScript modern, Anda dapat menggunakan .reduce()metode ini:

var obj = arr.reduce(function(acc, cur, i) {
  acc[i] = cur;
  return acc;
}, {});

Yang itu juga menghindari "lubang" dalam array, karena itulah cara .reduce()kerjanya.

Runcing
sumber
2
@ m93a sudah menjadi objek. Dalam JavaScript, benar-benar tidak ada gunanya membuat instance Array ( []) jika Anda tidak akan menggunakan kunci properti numerik dan properti "length".
Runcing
14
cara yang lebih bersih untuk menghindari penugasan kembali paramconst obj = arr.reduce((obj, cur, i) => { return { ...obj, [i]: cur }; }, {});
huygn
3
Tanda panah + perusak sintaksis tanpa pengembalian eksplisit:const obj = arr.reduce((obj, cur, i) => ({ ...obj, [i]: cur }), {});
Marc Scheib
2
@ eugene_sunic memang, tetapi pendekatan itu tidak tersedia ketika saya menjawab ini pada tahun 2010 :)
Runcing
2
Seperti @miro tunjukkan, membuat objek baru setiap kali tidak diperlukan, dan pada kenyataannya jauh lebih lambat daripada memanipulasi objek awal yang telah dibuat. Menjalankan tes JSPerf pada larik 1000 elemen, membuat objek baru setiap kali 1.000 kali lebih lambat daripada memutasikan objek yang ada. jsperf.com/…
romellem
281

Anda bisa menggunakan akumulator alias reduce.

['a','b','c'].reduce(function(result, item, index, array) {
  result[index] = item; //a, b, c
  return result;
}, {}) //watch out the empty {}, which is passed as "result"

Berikan objek kosong {}sebagai titik awal; lalu "tambah" objek itu secara bertahap. Di akhir iterasi, resultakan{"0": "a", "1": "b", "2": "c"}

Jika array Anda adalah satu set objek pasangan nilai kunci:

[{ a: 1},{ b: 2},{ c: 3}].reduce(function(result, item) {
  var key = Object.keys(item)[0]; //first property: a, b, c
  result[key] = item[key];
  return result;
}, {});

akan menghasilkan: {a: 1, b: 2, c: 3}

Demi kelengkapan, reduceRightmemungkinkan Anda untuk beralih di atas array Anda dalam urutan terbalik:

[{ a: 1},{ b: 2},{ c: 3}].reduceRight(/* same implementation as above */)

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 []:

[{ a: 1},{ b: 2},{ c: 3}].reduce(function(result, item, index) {
  var key = Object.keys(item)[0]; //first property: a, b, c
  var value = item[key];
  var obj = {};
  obj[value] = key;
  result.push(obj);
  return result;
}, []); //an empty array

akan menghasilkan: [{1: "a"}, {2: "b"}, {3: "c"}]

Berbeda dengan itu map, reducemungkin tidak digunakan sebagai pemetaan 1-1. Anda memiliki kontrol penuh atas item yang ingin Anda sertakan atau kecualikan. Karena itu reducememungkinkan Anda untuk mencapai apa filteryang membuatnya, yang reducesangat fleksibel:

[{ a: 1},{ b: 2},{ c: 3}].reduce(function(result, item, index) {
  if(index !== 0) { //skip the first item
    result.push(item);
  }
  return result;
}, []); //an empty array

akan menghasilkan: [{2: "b"}, {3: "c"}]

Perhatian : reducedan Object.keymerupakan bagian dari ECMA 5th edition; Anda harus menyediakan polyfill untuk browser yang tidak mendukungnya (terutama IE8).

Lihat implementasi standar oleh Mozilla .

roland
sumber
1
Membantu memelihara toko redux ketika Anda menggunakan peta objek dan Anda perlu menjatuhkan salah satu kunci
dhruvpatel
101

Jika Anda menggunakan jquery:

$.extend({}, ['a', 'b', 'c']);
Maks
sumber
4
Aneh, jika saya berikan dalam variabel Array menempatkan setiap karakter dalam objek yang terpisah: 0: "a", 1: ",", 2: "b" ... Jadi ia mengabaikan tanda kutip, tetapi termasuk koma .. .
TrySpace
@ Max Saya pikir tidak ada perilaku seperti itu. Objek yang dikembalikan adalah {0: 'a', 1: 'b', 2: 'c'}hasil yang diharapkan.
ivkremer
3
Apakah ada cara untuk menggunakan $ .extend sambil juga menginformasikan kunci secara non-numerik, yaitu: membuat perhitungan pada item-item array?
Davi Lima
tes super awsome dan pendek
Faisal Mehmood Awan
63

Untuk kelengkapan, ECMAScript 2015 (ES6) menyebar. Akan membutuhkan transpiler (Babel) atau lingkungan yang menjalankan setidaknya ES6.

console.log(
   { ...['a', 'b', 'c'] }
)

mcmhav
sumber
2
Sebenarnya ini juga tidak tersedia di ES2015. Namun sangat elegan.
Aluan Haddad
47

Saya mungkin akan menulis seperti ini (karena sangat jarang saya tidak akan memiliki perpustakaan underscorejs di tangan):

var _ = require('underscore');

var a = [ 'a', 'b', 'c' ];
var obj = _.extend({}, a);
console.log(obj);
// prints { '0': 'a', '1': 'b', '2': 'c' }
Dave Dopson
sumber
9
Anda menurunkan respons saya, tetapi tidak ada komentar? Jawaban saya benar dan teruji. Apa keberatannya?
Dave Dopson
14
Pertanyaan ini tidak memiliki tag garis bawah, dan Anda juga mengasumsikan node.js atau pustaka yang diperlukan.
David Hellsing
10
garis bawah cukup umum pada klien dan server. Ini diasumsikan untuk Backbone.js dan mungkin THE utilitas perpustakaan paling umum. Yang sedang berkata, saya menyertakan baris memerlukan untuk menjelaskan saya menggunakan perpustakaan. Tidak ada 1-liner untuk menggambarkan "tambahkan underscore.js ke halaman Anda", jadi beberapa terjemahan diperlukan untuk lingkungan browser
Dave Dopson
6
Namun, jika Anda menggunakan garis bawah, sederhana obj=_.extend({},a);akan melakukan pekerjaan itu. Juga, jika Anda mengulangi melalui array saya katakan _.eachakan lebih tepat daripada _.map. Secara keseluruhan, ini bukan jawaban yang baik untuk beberapa level.
David Hellsing
4
Orang-orang "Anda harus menjawab tanpa menyebutkan garis bawah atau tanda hubung" sangat menyebalkan. Sebanding dengan mengatakan bahwa Anda harus menjawab pertanyaan C ++ tanpa menyebutkan pustaka standar. Jika garis bawah atau tanda hubung bukan pilihan, OP harus menyebutkan itu.
Charlie Martin
26

Berikut adalah metode O (1) ES2015 hanya untuk kelengkapan.

var arr = [1, 2, 3, 4, 5]; // array, already an object
Object.setPrototypeOf(arr, Object.prototype); // now no longer an array, still an object
Benjamin Gruenbaum
sumber
(1) Menurut MDN , mengubah [[Prototipe]] suatu objek adalah operasi yang sangat lambat. (2) Ini tidak menghapus lengthproperti sendiri . (3) Objek masih berupa array Array.isArray(arr) === true,. (4) Perilaku array khusus tidak dihapus, misalnya arr.length = 0menghapus semua indeks. (5) Karena itu, saya pikir Object.assignjauh lebih baik .
Oriol
1
@Oriol mdn salah, setidaknya di V8 (tetapi juga mesin lain) ini adalah operasi yang cukup cepat dalam kasus khusus ini - karena benda memiliki toko numerik, ini pada dasarnya mengubah dua petunjuk.
Benjamin Gruenbaum
Ini juga dapat digunakan untuk fakta bahwa ia tampaknya unik di antara solusi cepat lainnya, untuk menjaga properti non-indeks ("milik") pada array (yaitu, properti integer non-positif) ...
Brett Zamir
Tapi hmm, Array.isArraykembali trueuntuk "objek" di sini meskipun instanceof Arraytidak ...
Brett Zamir
@BrettZamir yang terdengar seperti bug: D
Benjamin Gruenbaum
26

Terkejut tidak melihat -

console.log(
  Object.assign({}, ['a', 'b', 'c'])
)

Wylliam Judd
sumber
Setiap saran cerdas untuk dibuat { "first":"a", "second":"b","third":"c" }dengan kunci yang diperbaiki - Saya mencari destruct
mplungjan
@ mplungjan Saya sarankan menggunakan pengurangan daripada menetapkan dalam kasus itu. Mungkin ada perpustakaan yang memungkinkan Anda untuk menghitung setiap ordinal jika itu diperlukan.
Wylliam Judd
Saya punya kasus lain hari ini. Saya akhirnya mengajukan pertanyaan tentang hal itu: stackoverflow.com/questions/62197270/destruct-using-titles/…
mplungjan
23

kita dapat menggunakan Object.assigndan array.reduceberfungsi untuk mengubah Array ke Objek.

var arr = [{a:{b:1}},{c:{d:2}}] 
var newObj = arr.reduce((a, b) => Object.assign(a, b), {})

console.log(newObj)

KARTHIKEYAN.A
sumber
Ini yang saya cari. Saya tidak membutuhkan indeces, saya perlu mengubah array menjadi pasangan key-value yang dipertahankan.
Mike K
18

Saya akhirnya menggunakan operator penyebaran objek, karena ini adalah bagian dari standar ECMAScript 2015 (ES6).

const array = ['a', 'b', 'c'];
console.log({...array});
// it outputs {0:'a', 1:'b', 2:'c'}

Jadikan biola sebagai contoh.

locropulenton
sumber
1
Saya tidak yakin tentang kinerja ini, tetapi dari begitu banyak konversi Array ke Objek (karena saya ingin menggunakan objek untuk semua kode saya untuk membakukannya), ini mungkin yang paling mudah.
Seseorang Spesial
Bagaimana ini lebih baik daripada jawaban yang sudah ada yang memberikan solusi yang sama?
Dan Dascalescu
17
Object.assign({}, ['one', 'two']); // {0: 'one', 1: 'two'}

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, Arraydonasikan properti ke yang baru {}.

Appeiron
sumber
Bagaimana ini lebih baik daripada jawaban yang sudah ada yang memberikan solusi yang sama?
Dan Dascalescu
Dan Dascalescu pada waktu saya telah menambahkan jawaban hanya ada jawaban di atas O.assigntetapi tidak ada penjelasan. Saat ini merusak array menjadi objek adalah cara ( {...array})
Appeiron
14

Untuk ES2016, sebarkan operator untuk objek. Catatan: Ini setelah ES6 dan karenanya transpiler perlu disesuaikan.

const arr = ['a', 'b', 'c'];
const obj = {...arr}; // -> {0: "a", 1: "b", 2: "c"} 

Oleksii Trekhleb
sumber
Jawaban operator spread sudah diberikan 2 tahun sebelumnya .
Dan Dascalescu
11

Lima tahun kemudian, ada cara yang baik :)

Object.assign diperkenalkan di ECMAScript 2015.

Object.assign({}, ['a', 'b', 'c'])
// {'0':'a', '1':'b', '2':'c'}
Paul Draper
sumber
10

Menggunakan javascript#forEachsatu dapat melakukan ini

var result = {},
    attributes = ['a', 'b','c'];

attributes.forEach(function(prop,index) {
  result[index] = prop;
});

Dengan ECMA6:

attributes.forEach((prop,index)=>result[index] = prop);
RIYAJ KHAN
sumber
10

FWIW, satu pendekatan baru lainnya adalah menggunakan yang baru Object.fromEntriesbersama dengan Object.entriessebagai berikut:

const arr = ['a','b','c'];
arr[-2] = 'd';
arr.hello = 'e';
arr.length = 17;
const obj = Object.fromEntries(Object.entries(arr));

... yang memungkinkan untuk menghindari penyimpanan item array jarang sebagai undefinedatau nulldan mempertahankan kunci non-indeks (misalnya, non-bilangan bulat positif / non-numerik).

Seseorang mungkin ingin menambahkan arr.length, karena itu tidak termasuk:

obj.length = arr.length;
Brett Zamir
sumber
9

Anda dapat menggunakan operator spread

x = [1,2,3,10]
{...x} // {0:1, 1:2, 2:3, 3:10}
noel zubin
sumber
1
Jawaban ini sudah diberikan beberapa kali.
Dan Dascalescu
9

Jika Anda menggunakan ES6, Anda bisa menggunakan Object.assign dan operator spread

{ ...['a', 'b', 'c'] }

Jika Anda memiliki array bersarang suka

var arr=[[1,2,3,4]]
Object.assign(...arr.map(d => ({[d[0]]: d[1]})))
murthy naika k
sumber
1
Tidak hanya nama variabel Anda berbeda, tetapi contoh Anda tidak akan berfungsi, membuat peta dari konstruktor pada awalnya membutuhkan Array nilai kunci 2d. new Map([['key1', 'value1'], ['key2', 'value2']]);
Shannon Hochkins
5

Yang cepat dan kotor:

var obj = {},
  arr = ['a','b','c'],
  l = arr.length; 

while( l && (obj[--l] = arr.pop() ) ){};
Mik
sumber
Saya pikir Anda lupa mengujinya; itu menghasilkan {0:"c", 1:"b", 2:"a"}. Anda ingin unshiftsebagai gantinya popatau (lebih baik) mulai dengan i=arr.length-1dan sebagai gantinya penurunan.
Phrogz
yeah .. baru saja mengubahnya, tetapi kemudian menjadi kurang menarik: /
Mic
Bahkan bisa melakukannya l = arr.length, dan kemudian while (l && (obj[--l] = arr.pop())){}(saya menyadari ini sudah tua, tetapi mengapa tidak menyederhanakannya lebih jauh).
Qix - MONICA DISEBUTKAN
2
@Qix, Pemendekan bagus
Mic
4

Cepat dan kotor # 2:

var i = 0
  , s = {}
  , a = ['A', 'B', 'C'];

while( a[i] ) { s[i] = a[i++] };
lordkrandel
sumber
Mengapa Anda menggunakan notasi koma?
Conner Ruhl
3
Preferensi pribadi agar koma memimpin di baris berikutnya. Saya menemukan notasi ini lebih mudah dibaca.
BingeBoy
1
Loop akan berhenti jika array berisi nilai falsy. Anda harus memeriksa i < a.lengthalih-alih a[i].
Oriol
4

Pada Lodash 3.0.0 Anda dapat menggunakan _.toPlainObject

var obj = _.toPlainObject(['a', 'b', 'c']);
console.log(obj);
<script src="https://cdn.jsdelivr.net/lodash/4.16.4/lodash.min.js"></script>

acontell
sumber
3

Inilah fungsi rekursif yang baru saja saya tulis. Sederhana dan berfungsi dengan baik.

// Convert array to object
var convArrToObj = function(array){
    var thisEleObj = new Object();
    if(typeof array == "object"){
        for(var i in array){
            var thisEle = convArrToObj(array[i]);
            thisEleObj[i] = thisEle;
        }
    }else {
        thisEleObj = array;
    }
    return thisEleObj;
}

Berikut ini sebuah contoh ( jsFiddle ):

var array = new Array();
array.a = 123;
array.b = 234;
array.c = 345;
var array2 = new Array();
array2.a = 321;
array2.b = 432;
array2.c = 543;
var array3 = new Array();
array3.a = 132;
array3.b = 243;
array3.c = 354;
var array4 = new Array();
array4.a = 312;
array4.b = 423;
array4.c = 534;
var array5 = new Array();
array5.a = 112;
array5.b = 223;
array5.c = 334;

array.d = array2;
array4.d = array5;
array3.d = array4;
array.e = array3;


console.log(array);

// Convert array to object
var convArrToObj = function(array){
    var thisEleObj = new Object();
    if(typeof array == "object"){
        for(var i in array){
            var thisEle = convArrToObj(array[i]);
            thisEleObj[i] = thisEle;
        }
    }else {
        thisEleObj = array;
    }
    return thisEleObj;
}
console.log(convArrToObj(array));

Hasil: Array Rekursif ke Objek

JVE999
sumber
Bekerja dengan sangat baik. Terima kasih
Hanmaslah
Ini harus lebih tinggi, jika Anda memiliki ['a' = '1', 'b' = '2', 'c' = '3']dan menginginkannya {a: 1, b: 2, c: 3}berfungsi sempurna.
Wanjia
3
.reduce((o,v,i)=>(o[i]=v,o), {})

[docs]

atau lebih verbose

var trAr2Obj = function (arr) {return arr.reduce((o,v,i)=>(o[i]=v,o), {});}

atau

var transposeAr2Obj = arr=>arr.reduce((o,v,i)=>(o[i]=v,o), {})

yang terpendek dengan vanilla JS

JSON.stringify([["a", "X"], ["b", "Y"]].reduce((o,v,i)=>{return o[i]=v,o}, {}))
=> "{"0":["a","X"],"1":["b","Y"]}"

beberapa contoh yang lebih kompleks

[["a", "X"], ["b", "Y"]].reduce((o,v,i)=>{return o[v[0]]=v.slice(1)[0],o}, {})
=> Object {a: "X", b: "Y"}

bahkan lebih pendek (dengan menggunakan function(e) {console.log(e); return e;}=== (e)=>(console.log(e),e))

 nodejs
> [[1, 2, 3], [3,4,5]].reduce((o,v,i)=>(o[v[0]]=v.slice(1),o), {})
{ '1': [ 2, 3 ], '3': [ 4, 5 ] }

[/ docs]

test30
sumber
Apa yang ingin Anda lakukan [/docs]? Akan lebih bermanfaat untuk membuat potongan kode dieksekusi.
Dan Dascalescu
3

Saya akan melakukan ini hanya dengan Array.of(). Array memiliki kemampuan untuk menggunakan konteksnya sebagai konstruktor.

CATATAN 2 Fungsi adalah metode pabrik yang sengaja dibuat generik; tidak mensyaratkan bahwa nilai ini menjadi konstruktor Array. Oleh karena itu dapat ditransfer ke atau diwarisi oleh konstruktor lain yang dapat dipanggil dengan argumen numerik tunggal.

Jadi kita dapat mengikat Array.of()ke fungsi dan menghasilkan objek seperti array.

function dummy(){};
var thingy = Array.of.apply(dummy,[1,2,3,4]);
console.log(thingy);

Dengan memanfaatkan Array.of() satu bahkan dapat melakukan sub-class array .

Redu
sumber
3

Jika Anda dapat menggunakan Mapatau Object.assign, itu sangat mudah.

Buat sebuah array:

const languages = ['css', 'javascript', 'php', 'html'];

Di bawah ini membuat objek dengan indeks sebagai kunci:

Object.assign({}, languages)

Replikasi sama seperti di atas dengan Maps

Mengonversi ke objek berbasis indeks {0 : 'css'}dll ...

const indexMap = new Map(languages.map((name, i) => [i, name] ));
indexMap.get(1) // javascript

Konversi ke objek berbasis nilai {css : 'css is great'}dll ...

const valueMap = new Map(languages.map(name => [name, `${name} is great!`] ));
valueMap.get('css') // css is great
Shannon Hochkins
sumber
3

Metode sederhana dan kurang ajar dalam mengonversi Array item menjadi Objek dengan cepat

function arrayToObject( srcArray ){
    return  JSON.parse( JSON.stringify( srcArray ) );
}

Kemudian menggunakannya seperti itu ...

var p = [0,2,3,'pork','pie',6];
obj = new arrayToObject( p );
console.log( obj[3], obj[4] )
// expecting `pork pie`

Keluaran:

pork pie

Memeriksa jenisnya:

typeof obj
"object"

DAN semuanya tidak akan lengkap jika tidak ada metode prototipe

Array.prototype.toObject =function(){
    return  JSON.parse( JSON.stringify( this ) );
}

Menggunakan seperti:

var q = [0,2,3,'cheese','whizz',6];
obj = q.toObject();
console.log( obj[3], obj[4] )
// expecting `cheese whizz`

Keluaran:

cheese whizz

* 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.

Array.prototype.toObject = function(keys){
    var obj = {};
    var tmp = this; // we want the original array intact.
    if(keys.length == this.length){
        var c = this.length-1;
        while( c>=0 ){
            obj[ keys[ c ] ] = tmp[c];
            c--;
        }
    }
    return obj;
};

result = ["cheese","paint",14,8].toObject([0,"onion",4,99]);

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

Array.prototype.toObject = function(keys){
    var obj = {};
    if( keys.length == this.length)
        while( keys.length )
            obj[ keys.pop() ] = this[ keys.length ];
    return obj;
};
Mark Giblin
sumber
Ini menghancurkan baik isi array kunci dan, terlepas dari komentar internal, juga array nilai (isinya). JavaScript bekerja secara berbeda dari PHP dengan JavaScript yang secara otomatis bekerja berdasarkan referensi pada properti dari suatu objek / array.
Brett Zamir
Tidak, rutin membuat salinan, yang asli tidak disentuh.
Mark Giblin
Ya, aslinya tersentuh. Lihat jsfiddle.net/bRTv7 . Panjang array berakhir menjadi 0.
Brett Zamir
Ok, versi yang diedit saya baru saja mengubahnya dengan tidak merusak array, menemukan yang aneh bahwa seharusnya melakukan itu.
Mark Giblin
1
Metode yang diperbarui yang harus didukung di browser lama karena JSON telah ada lebih lama daripada ECMA menambahkan fitur kode baru
Mark Giblin
2

let i = 0;
let myArray = ["first", "second", "third", "fourth"];

const arrayToObject = (arr) =>
    Object.assign({}, ...arr.map(item => ({[i++]: item})));

console.log(arrayToObject(myArray));

Atau gunakan

myArray = ["first", "second", "third", "fourth"]
console.log({...myArray})

Bashirpour
sumber
2

ES5 - Solusi:

Menggunakan fungsi prototipe Array 'push' dan 'apply' Anda dapat mengisi objek dengan elemen array.

var arr = ['a','b','c'];
var obj = new Object();
Array.prototype.push.apply(obj, arr);
console.log(obj);    // { '0': 'a', '1': 'b', '2': 'c', length: 3 }
console.log(obj[2]); // c

SridharKritha
sumber
Bagaimana jika saya ingin pindah ke{ name: a, div :b, salary:c}
Prashant Pimpale
2

Lebih banyak browser yang didukung dan cara yang lebih fleksibel untuk melakukan itu menggunakan loop normal , sesuatu seperti:

const arr = ['a', 'b', 'c'],
obj = {};

for (let i=0; i<arr.length; i++) {
   obj[i] = arr[i];
}

Tetapi juga cara modern bisa menggunakan operator spread , seperti:

{...arr}

Atau Object assign :

Object.assign({}, ['a', 'b', 'c']);

Keduanya akan kembali :

{0: "a", 1: "b", 2: "c"}
Alireza
sumber
1

Anda dapat menggunakan fungsi seperti ini:

var toObject = function(array) {
    var o = {};
    for (var property in array) {
        if (String(property >>> 0) == property && property >>> 0 != 0xffffffff) {
            o[i] = array[i];
        }
    }
    return o;
};

Yang ini harus menangani array jarang lebih efisien.

Pablo Cabrera
sumber
1

Inilah solusi dalam naskah kopi

arrayToObj = (arr) ->
  obj = {}
  for v,i in arr
    obj[i] = v if v?
  obj
David
sumber
7
Apa itu kopi resep? Kita berbicara tentang JS! : D
m93a
2
Ini sedikit bahasa yang dikompilasi ke dalam JavaScript :)
David
6
Hmph, ini menggunakan notasi aneh. Saya lebih suka JS polos.
m93a
2
@ David Anda bisa melakukan keseluruhan untuk loop pada 1 baris untuk membuat semuanya hanya 3 baris. :) Contoh:obj[i] = v for v,i in arr when v?
XåpplI'-I0llwlg'I -