Apa cara terbaik untuk mengonversi:
['a','b','c']
untuk:
{
0: 'a',
1: 'b',
2: 'c'
}
_.keyBy
(sebelumnya _.indexBy
): lodash.com/docs#keyBy
_.toPlainObject
. Mis:var myObj = _.toPlainObject(myArr)
Apa cara terbaik untuk mengonversi:
['a','b','c']
untuk:
{
0: 'a',
1: 'b',
2: 'c'
}
_.keyBy
(sebelumnya _.indexBy
): lodash.com/docs#keyBy
_.toPlainObject
. Mis:var myObj = _.toPlainObject(myArr)
Jawaban:
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 length
properti dari array tidak akan disalin karena tidak enumerable.
Selain itu, Anda dapat menggunakan sintaksis penyebaran ES6 untuk mencapai hasil yang sama:
{ ...['a', 'b', 'c'] }
{ ...[sortedArray]}
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.
[]
) 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
.
['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, result
akan{"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, reduceRight
memungkinkan 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
, reduce
mungkin tidak digunakan sebagai pemetaan 1-1. Anda memiliki kontrol penuh atas item yang ingin Anda sertakan atau kecualikan. Karena itu reduce
memungkinkan Anda untuk mencapai apa filter
yang membuatnya, yang reduce
sangat 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 : reduce
dan Object.key
merupakan bagian dari ECMA 5th edition
; Anda harus menyediakan polyfill untuk browser yang tidak mendukungnya (terutama IE8).
Lihat implementasi standar oleh Mozilla .
Jika Anda menggunakan jquery:
$.extend({}, ['a', 'b', 'c']);
{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.
console.log(
{ ...['a', 'b', 'c'] }
)
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' }
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.
var arr = [1, 2, 3, 4, 5]; // array, already an object
Object.setPrototypeOf(arr, Object.prototype); // now no longer an array, still an object
length
properti sendiri . (3) Objek masih berupa array Array.isArray(arr) === true
,. (4) Perilaku array khusus tidak dihapus, misalnya arr.length = 0
menghapus semua indeks. (5) Karena itu, saya pikir Object.assign
jauh lebih baik .
Array.isArray
kembali true
untuk "objek" di sini meskipun instanceof Array
tidak ...
Terkejut tidak melihat -
console.log(
Object.assign({}, ['a', 'b', 'c'])
)
{ "first":"a", "second":"b","third":"c" }
dengan kunci yang diperbaiki - Saya mencari destruct
kita dapat menggunakan Object.assign
dan array.reduce
berfungsi 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)
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.
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, Array
donasikan properti ke yang baru {}
.
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.
const arr = ['a', 'b', 'c'];
const obj = {...arr}; // -> {0: "a", 1: "b", 2: "c"}
Lima tahun kemudian, ada cara yang baik :)
Object.assign
diperkenalkan di ECMAScript 2015.
Object.assign({}, ['a', 'b', 'c'])
// {'0':'a', '1':'b', '2':'c'}
Menggunakan javascript#forEach
satu 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);
FWIW, satu pendekatan baru lainnya adalah menggunakan yang baru Object.fromEntries
bersama dengan Object.entries
sebagai 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 undefined
atau null
dan 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;
Anda dapat menggunakan operator spread
x = [1,2,3,10]
{...x} // {0:1, 1:2, 2:3, 3:10}
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]})))
new Map([['key1', 'value1'], ['key2', 'value2']]);
Yang cepat dan kotor:
var obj = {},
arr = ['a','b','c'],
l = arr.length;
while( l && (obj[--l] = arr.pop() ) ){};
{0:"c", 1:"b", 2:"a"}
. Anda ingin unshift
sebagai gantinya pop
atau (lebih baik) mulai dengan i=arr.length-1
dan sebagai gantinya penurunan.
l = arr.length
, dan kemudian while (l && (obj[--l] = arr.pop())){}
(saya menyadari ini sudah tua, tetapi mengapa tidak menyederhanakannya lebih jauh).
Cepat dan kotor # 2:
var i = 0
, s = {}
, a = ['A', 'B', 'C'];
while( a[i] ) { s[i] = a[i++] };
i < a.length
alih-alih a[i]
.
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>
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:
['a' = '1', 'b' = '2', 'c' = '3']
dan menginginkannya {a: 1, b: 2, c: 3}
berfungsi sempurna.
.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]
[/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.
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 .
Jika Anda dapat menggunakan Map
atau 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
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;
};
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})
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
{ name: a, div :b, salary:c}
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"}
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.
Inilah solusi dalam naskah kopi
arrayToObj = (arr) ->
obj = {}
for v,i in arr
obj[i] = v if v?
obj
obj[i] = v for v,i in arr when v?