Diziyi Nesneye Dönüştür


514

Dönüştürmenin en iyi yolu nedir:

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

için:

{
  0: 'a',
  1: 'b',
  2: 'c'
}

3
Belki o ne ihtiyacı bazı ördek yazarak kodu içindir değil bir Array örneği olduğunu düşünmek
Pointy

6
JavaScript diziler işaret Onun değerinde olan nesneler.
Spudley

Başka biri bir Lodash çözümü arıyorsa, _.keyBy(daha önce _.indexBy) düşünün : lodash.com/docs#keyBy
2540625

Bu diziler nesnelerin çünkü zaten biraz kafa karıştırıcı, ama sorunun noktası dönüştürmektedir tahmin dizi egzotik nesneyi bir etmek sıradan bir nesne .
Oriol

1
Lodash ile bunu yapmanın basit bir yolu _.toPlainObject. Örn:var myObj = _.toPlainObject(myArr)
Julian Soro

Yanıtlar:


473

ECMAScript 6 kolayca poli-doldurulabilir olanı sunar Object.assign:

Object.assign()Usul, bir hedef nesne, bir ya da daha fazla kaynak nesnelerden her numaralandırılabilir kendi özelliklerinin değerlerini kopyalamak için kullanılır. Hedef nesneyi döndürür.

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

Dizinin kendi lengthözelliği numaralandırılamadığından kopyalanmaz.

Ayrıca, aynı sonucu elde etmek için ES6 forma sözdizimini kullanabilirsiniz:

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

Sadece işaret etmek istiyorum - eğer zaten orijinal nesneden bir dizi sıralanmış özellik varsa, yayılma operatörünü kullanmak o diziyi doğrudan yeni bir nesneye dönüştürecek { ...[sortedArray]}
şeydir

Oriol, 0 ve 1 yerine sabit bir anahtar ayarlamanın bir yolu var mı?
Menai Ala Eddine

488

Bunun gibi bir işlevle:

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

Diziniz zaten az ya da çok sadece bir nesnedir, ancak dizilerin tamsayı olarak adlandırılan özelliklere göre bazı "ilginç" ve özel davranışları vardır. Yukarıdakiler size düz bir nesne verecektir.

düzenlemek oh ayrıca dizi "delikler" için hesap oluşturmak isteyebilirsiniz:

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

Modern JavaScript çalışma zamanlarında, .reduce()yöntemi kullanabilirsiniz :

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

Bu da dizideki "deliklerden" kaçınır, çünkü böyle .reduce()çalışır.


2
@ m93a zaten bir nesne. JavaScript'te, []sayısal özellik anahtarlarını ve "length" özelliğini kullanmayacaksanız gerçekten bir Array örneği ( ) oluşturmanın anlamı yoktur .
Sivri

14
param yeniden atamak önlemek için daha temiz bir yolconst obj = arr.reduce((obj, cur, i) => { return { ...obj, [i]: cur }; }, {});
huygn

3
Arrow + dönüşü olmayan yıkım sözdizimi:const obj = arr.reduce((obj, cur, i) => ({ ...obj, [i]: cur }), {});
Marc Scheib

2
@eugene_sunic, ama 2010 yılında bunu cevapladığımda bu yaklaşım mevcut değildi :)
Pointy

2
@Miro'nun işaret ettiği gibi, her seferinde yeni bir nesne oluşturmak gerekli değildir ve aslında oluşturulan ilk nesneyi manipüle etmekten çok daha yavaştır . 1000 elemanlık bir dizi üzerinde bir JSPerf testi çalıştırmak, her seferinde yeni bir nesne oluşturmak , mevcut nesneyi değiştirmekten 1000 kat daha yavaştır. jsperf.com/…
romellem

281

Bir akümülatör aka kullanabilirsiniz 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"

Boş bir nesneyi {}başlangıç ​​noktası olarak iletin; sonra bu nesneyi adım adım "büyüt". Tekrarlamalar sonunda resultolacak{"0": "a", "1": "b", "2": "c"}

Diziniz bir dizi anahtar / değer çifti nesnesiyse:

[{ 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;
}, {});

üretecek: {a: 1, b: 2, c: 3}

Tamlık uğruna, reduceRightdizinizi ters sırayla yinelemenizi sağlar:

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

üretecek: {c:3, b:2, a:1}

Akümülatörünüz size özel bir amaç için herhangi bir tipte olabilir. Örneğin, bir dizideki nesnenizin anahtarını ve değerini değiştirmek için şunu iletin []:

[{ 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

üretecek: [{1: "a"}, {2: "b"}, {3: "c"}]

Bunun aksine map, reduce1-1 eşleme olarak kullanılamaz. Eklemek veya hariç tutmak istediğiniz öğeler üzerinde tam kontrole sahipsiniz. Bu nedenle reduce, çok yönlü filterkılan şeyleri elde etmenizi sağlar reduce:

[{ 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

üretecek: [{2: "b"}, {3: "c"}]

Dikkat : reduceve Object.keybir parçasıdır ECMA 5th edition; desteklemeyen tarayıcılar için (özellikle IE8) bir çoklu dolgu sağlamalısınız.

Mozilla'nın varsayılan uygulamasına bakın .


1
Nesnelerin haritasını kullanırken ve anahtarlardan birini düşürmeniz gerektiğinde bir redux mağazasının bakımında yardımcı olur
dhruvpatel

101

Jquery kullanıyorsanız:

$.extend({}, ['a', 'b', 'c']);

4
Tuhaf, bir Array değişkeninde verirseniz, her karakteri ayrı bir nesneye koyar: 0: "a", 1: ",", 2: "b" ... Yani tırnakları yok sayar, ancak virgül içerir .. .
TrySpace

@Max Böyle bir davranış olmadığını düşünüyorum. Döndürülen nesne {0: 'a', 1: 'b', 2: 'c'}beklenen sonuçtur.
ivkremer

3
Anahtarları sayısal olmayan bir şekilde bildirirken $ .extend kullanmanın bir yolu var mı, yani: dizi öğeleri üzerinde hesaplamalar yapmak?
Davi Lima

süper awsome ve kısa test
Faisal Mehmood Awan

63

Bütünlük için ECMAScript 2015 (ES6) yayılıyor. Bir transpiler (Babel) veya en az ES6 çalıştıran bir ortam gerektirir.

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


2
Aslında bu ES2015'te yerel olarak mevcut değildir. Ancak çok zarif.
Aluan Haddad

47

Muhtemelen bu şekilde yazardım (çok nadiren elimde underscorejs kütüphanesine sahip olmayacağım):

var _ = require('underscore');

var a = [ 'a', 'b', 'c' ];
var obj = _.extend({}, a);
console.log(obj);
// prints { '0': 'a', '1': 'b', '2': 'c' }

9
cevabımı küçümsersiniz, ama yorum yok mu? Cevabım doğru ve test edildi. İtiraz nedir?
Dave Dopson

14
Bu sorunun alt çizgi etiketi yoktur ve ayrıca node.js veya bir zorunlu kitaplık olduğunu varsayıyorsunuz.
David Hellsing

10
alt çizgi hem istemci hem de sunucuda oldukça yaygındır. Backbone.js için varsayılmıştır ve muhtemelen en yaygın yardımcı program kütüphanesidir. Olduğu söyleniyor, bir kütüphane kullandığımı açıkça belirtmek için gerekli satırı dahil ettim. "Sayfanıza underscore.js ekle" yi açıklayan 1
satır yok

6
Yine de, undserscore kullanıyorsanız, basit bir obj=_.extend({},a);iş yapardı. Ayrıca, dizilerle yineliyorsanız, _.eachdaha uygun olacağını söyleyebilirim _.map. Sonuçta, bu birkaç düzeyde iyi bir cevap değil.
David Hellsing

4
"Alt çizgiden veya lo-dash'den bahsetmeden cevap vermelisin" insanlar çok can sıkıcı. Standart kütüphanelerden bahsetmeden C ++ sorularına cevap vermeniz gerektiğini söyleyebiliriz. Alt çizgi veya lo-tire bir seçenek değilse, OP bundan bahsetmelidir.
Charlie Martin

26

İşte tamlık için O (1) ES2015 yöntemi.

var arr = [1, 2, 3, 4, 5]; // array, already an object
Object.setPrototypeOf(arr, Object.prototype); // now no longer an array, still an object

(1) MDN'ye göre , bir nesnenin [[Prototip]] 'in değiştirilmesi çok yavaş bir işlemdir. (2) Bu, kendi lengthmülkünü kaldırmaz . (3) Nesne hala bir dizi Array.isArray(arr) === true. (4) Özel dizi davranışları kaldırılmaz, örneğin arr.length = 0tüm indeksleri kaldırır. (5) Bu nedenle bence Object.assignçok daha iyi .
Oriol

1
@Oriol mdn yanlış, en azından V8'de (ama aynı zamanda diğer motorlarda) bu, bu özel durumda oldukça hızlı bir işlemdir - nesnelerin yine de sayısal bir deposu olduğundan, bu temelde iki işaretçiyi değiştirir.
Benjamin Gruenbaum

Bu aynı zamanda dizideki indeks dışı ("kendi") özelliklerin (yani, pozitif-tamsayı olmayan özellikler) korunmasının, diğer hızlı çözümler arasında benzersiz olduğu gerçeği için de kullanılabilir ...
Brett Zamir

Ama hmm, olmasa da burada "nesne" için Array.isArraygeri dönüyor ...trueinstanceof Array
Brett Zamir

@BrettZamir bir hata gibi geliyor: D
Benjamin Gruenbaum

26

Görmemek şaşırdı -

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


{ "first":"a", "second":"b","third":"c" }Anahtarlar sabit ile oluşturmak için herhangi bir akıllı öneri - Ben bir yıkım arıyorum
mplungjan

@mplungjan Bu durumda atamak yerine küçültme kullanmanızı öneririm. Muhtemelen gerekirse her ordinal üzerinde numaralandırmanıza izin verecek bir kütüphane vardır.
Wylliam Judd

Bugün başka bir vakam vardı. Bu konuda bir soru sordum: stackoverflow.com/questions/62197270/destruct-using-titles/…
mplungjan

23

Kullanabileceğimiz Object.assignve array.reducenesne için bir dizisi dönüştürmek için çalışır.

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

console.log(newObj)


Aradığım şey buydu. İndekslere ihtiyacım yoktu, diziyi tutulan anahtar / değer çiftlerine dönüştürmek gerekiyordu.
Mike K

18

ECMAScript 2015 (ES6) standardının bir parçası olduğu için nesne yayma operatörü kullandım.

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

Aşağıdaki kemanı örnek olarak yaptık .


1
Bunun performansı hakkında emin değilim, ama bu kadar çok Array to Object dönüşüm (i standartlaştırmak için tüm kodlarım için nesneleri kullanmak istiyorum beri), bu muhtemelen en kolay.
Özel Birisi

Bu, aynı çözümü veren mevcut cevaplardan daha iyi mi?
Dan Dascalescu

17
Object.assign({}, ['one', 'two']); // {0: 'one', 1: 'two'}

Modern JavaScript'te kolay yol, Object.assign()anahtar: değeri bir nesneden diğerine kopyalamaktan başka bir şey yapmamaktır. Bizim durumumuzda, Arrayözellikleri yenilere bağışlar {}.


Bu, aynı çözümü veren mevcut cevaplardan daha iyi mi?
Dan Dascalescu

Dan Dascalescu o zaman cevap ekledim sadece yukarıdaki cevap vardı O.assignama açıklama yoktu. Günümüzde nesnesine dizi olan kurucuların bir yol ( {...array})
Appeiron

13

ES2016 için, nesneler için işleci dağıtın. Not: Bu sonra ES6 ve transpiler ayarlanması gerekir böylece.

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


Forma operatörü cevabı 2 yıl önce verildi .
Dan Dascalescu

11

Beş yıl sonra, iyi bir yol var :)

Object.assign ECMAScript 2015'te tanıtıldı.

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

10

javascript#forEachBirini kullanmak bunu yapabilir

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

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

ECMA6 ile:

attributes.forEach((prop,index)=>result[index] = prop);

10

FWIW, birbirini son yaklaşım yeni kullanmaktır Object.fromEntriesbirlikte Object.entriesaşağıdaki şekilde:

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

... bu, seyrek dizi öğelerinin undefinedveya olarak saklanmasından kaçınmaya izin verir nullve dizin olmayan (örn., pozitif olmayan tamsayı / sayısal olmayan) anahtarları korur.

arr.lengthBununla birlikte, bu dahil edilmediğinden eklemek isteyebilirsiniz :

obj.length = arr.length;


9

ES6 kullanıyorsanız, Object.assign ve forma operatörünü kullanabilirsiniz

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

Gibi bir iç içe diziniz varsa

var arr=[[1,2,3,4]]
Object.assign(...arr.map(d => ({[d[0]]: d[1]})))

1
Değişken adlarınız yalnızca farklı olmakla kalmaz, aynı zamanda örneğiniz çalışmaz, yapıcıdan bir harita oluşturmak için başlangıçta 2d anahtar / değer Dizisi gerekir. new Map([['key1', 'value1'], ['key2', 'value2']]);
Shannon Hochkins

5

Hızlı ve kirli olanı:

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

while( l && (obj[--l] = arr.pop() ) ){};

Bence bunu test etmeyi unuttun; üretir {0:"c", 1:"b", 2:"a"}. Bunun unshiftyerine popya da (daha iyi) ile başlamak i=arr.length-1ve onun yerine azaltmak istersiniz .
Phrogz

evet .. sadece değiştirdi, ama sonra daha az ilginç hale geldi: /
Mic

Hatta yapabilirdi l = arr.lengthve sonra while (l && (obj[--l] = arr.pop())){}(bunun eski olduğunu anlıyorum, ama neden daha da basitleştirmiyoruz).
Qix - MONICA

2
@Qix, Güzel kısalma
Mic

4

Hızlı ve kirli # 2:

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

while( a[i] ) { s[i] = a[i++] };

Neden virgül işareti kullanıyorsunuz?
Conner Ruhl

3
Bir sonraki satıra virgül koymak için kişisel tercih. Bu gösterimi okumayı daha kolay buluyorum.
BingeBoy

1
Dizi bir falsy değeri içeriyorsa döngü duracaktır. Bunun i < a.lengthyerine kontrol etmelisiniz a[i].
Oriol

4

Lodash 3.0.0 itibariyle kullanabilirsiniz _.toPlainObject

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


3

İşte az önce yazdığım özyinelemeli bir işlev. Çok basit ve iyi çalışıyor.

// 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;
}

İşte bir örnek ( 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));

Sonuçlar: Nesneye Özyinelemeli Dizi


Gerçekten iyi çalışıyor. Teşekkürler
Hanmaslah

Eğer daha iyi olmalı ['a' = '1', 'b' = '2', 'c' = '3']ve eğer {a: 1, b: 2, c: 3}bu mükemmel çalışıyor gibi istiyorum .
Wanjia

3
.reduce((o,v,i)=>(o[i]=v,o), {})

[Dokümanlar]

veya daha fazla ayrıntılı

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

veya

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

vanilya JS ile en kısa

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

daha karmaşık bir örnek

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

daha da kısa ( function(e) {console.log(e); return e;}=== kullanarak (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 ] }

[/ Dokümanlar]


Ne ile niyet ettin [/docs]? Kod parçacıklarını yürütülebilir yapmak daha yararlı olacaktır.
Dan Dascalescu

3

Bunu sadece ile yapardım Array.of(). Array, bağlamını bir kurucu olarak kullanma yeteneğine sahiptir.

Not 2 - işlevi kasıtlı olarak genel bir fabrika yöntemidir; bu değerinin Dizi yapıcısı olmasını gerektirmez. Bu nedenle, tek bir sayısal argümanla çağrılabilen diğer kuruculara aktarılabilir veya devralınabilir.

Bu nedenle Array.of()bir işleve bağlanabilir ve nesne gibi bir dizi oluşturabiliriz.

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

Array.of() Hatta birini kullanarak dizi alt sınıflandırma yapabilirsiniz .


3

Eğer kullanabiliyorsa Mapya Object.assign, bu çok kolaydır.

Dizi oluşturun:

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

Aşağıda, anahtar olarak dizini olan bir nesne oluşturulur:

Object.assign({}, languages)

Yukarıdakiyle aynı şeyi Google Haritalar ile çoğaltın

Dizin tabanlı bir nesneye {0 : 'css'}vb. Dönüştürür.

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

Değere dayalı bir nesneye dönüştürme {css : 'css is great'}vb.

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

3

Bir dizi öğeyi hızla bir nesneye dönüştürmenin basit ve arsız bir yöntemi

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

Sonra böyle kullanıyor ...

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

Çıktı:

pork pie

Türü kontrol etme:

typeof obj
"object"

VE bir prototip yöntemi olmasaydı işler tamamlanmazdı

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

Gibi kullanarak:

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

Çıktı:

cheese whizz

* Bir adlandırma yordamı olmadığını unutmayın, bu nedenle belirli adlara sahip olmak istiyorsanız, aşağıdaki mevcut yöntemleri kullanmaya devam etmeniz gerekir.


Eski yöntem

Bu, bir diziden, tanımladığınız tuşları kullanarak istediğiniz sırada bir nesne oluşturmanızı sağlar.

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); "paint" çıktısı verirse, fonksiyon eşit uzunlukta dizilere sahip olmalıdır veya boş bir nesne elde edersiniz.

İşte güncellenmiş bir yöntem

Array.prototype.toObject = function(keys){
    var obj = {};
    if( keys.length == this.length)
        while( keys.length )
            obj[ keys.pop() ] = this[ keys.length ];
    return obj;
};

Bu, hem anahtar dizisi içeriğini hem de dahili yoruma rağmen, değerler dizisini (içeriğini) yok eder. JavaScript, bir nesnenin / dizinin özelliklerine referans olarak otomatik olarak davranan JavaScript ile PHP'den farklı çalışır.
Brett Zamir

Hayır değil, rutin kopyalar, orijinale dokunulmaz.
Mark Giblin

Evet, orijinal dokümana dokunulur. Bkz. Jsfiddle.net/bRTv7 . Dizi uzunlukları her ikisi de 0 olur.
Brett Zamir

Tamam, sadece değiştirdiğim düzenlenmiş diziler dizileri yok etmiyor, bunu yapması gereken garip bul.
Mark Giblin

1
JSON ECMA'nın yeni kod özelliklerinden daha uzun sürdüğü için eski tarayıcılarda desteklenmesi gereken güncellenmiş yöntem
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));

Veya kullan

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


2

ES5 - Çözüm:

Kullanılması Dizi prototip işlevi push ' ve 'uygulamak' dizi öğelerinin nesneyi doldurabilirsiniz.

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


Ne dönüştürmek istiyorsam{ name: a, div :b, salary:c}
Prashant Pimpale

2

Daha fazla tarayıcı destekli ve bunu yapmanın daha esnek bir yolu, normal bir döngü kullanıyor :

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

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

Ama aynı zamanda modern yol, forma operatörünü kullanmak olabilir , örneğin:

{...arr}

Veya Nesne atama :

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

Her ikisi de geri dönecek :

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

1

Bunun gibi bir işlev kullanabilirsiniz:

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;
};

Bu, seyrek dizileri daha verimli bir şekilde ele almalıdır.


1

İşte kahvede bir çözüm

arrayToObj = (arr) ->
  obj = {}
  for v,i in arr
    obj[i] = v if v?
  obj

7
Kahve sütunu nedir? JS'den bahsediyoruz! : D
m93a

2
JavaScript'e derleyen küçük bir dil :)
David

6
Hmph, garip gösterim kullanıyor. Ben düz JS daha çok seviyorum.
m93a

2
@David Her şeyi sadece 3 satır yapmak için 1 satırdaki döngünün tamamını yapabilirsiniz. :) Örnek:obj[i] = v for v,i in arr when v?
XåpplI'-I0llwlg'I -
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.