Konwertuj tablicę na obiekt

514

Jaki jest najlepszy sposób konwersji:

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

do:

{
  0: 'a',
  1: 'b',
  2: 'c'
}
David Hellsing
źródło
3
Może potrzebuje tego, żeby jakiś kod piszący na klawiaturze nie myślał, że to instancja Array
Pointy,
6
Warto zauważyć, że tablice JavaScript obiektami.
Spudley,
Jeśli ktoś szuka rozwiązania Lodash, zastanów się _.keyBy(dawniej _.indexBy): lodash.com/docs#keyBy
2540625
Jest to nieco mylące, ponieważ tablice są już obiektami, ale myślę, że sedno pytania polega na przekształceniu tablicy egzotycznego obiektu w zwykły obiekt .
Oriol
1
Prostym sposobem na to z Lodash jest _.toPlainObject. Np .:var myObj = _.toPlainObject(myArr)
Julian Soro

Odpowiedzi:

473

ECMAScript 6 wprowadza łatwą do wielokrotnego napełniania Object.assign:

Object.assign()Sposób jest stosowany w celu skopiowania wartości wszystkich przeliczalnych właściwości własnych od jednego lub większej liczby obiektów źródłowych do obiektu docelowego. Zwróci obiekt docelowy.

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

Własna lengthwłaściwość tablicy nie jest kopiowana, ponieważ nie można jej wyliczyć.

Możesz także użyć składni spreadu ES6, aby osiągnąć ten sam wynik:

{ ...['a', 'b', 'c'] }
Oriol
źródło
Chciałbym tylko wskazać - jeśli masz już tablicę posortowanych właściwości z oryginalnego obiektu, użycie operatora rozkładania spowoduje, że tablica ta zamieni się bezpośrednio w nowy obiekt:{ ...[sortedArray]}
HappyHands31
Oriol, czy istnieje sposób, aby ustawić stały klucz zamiast 0 i 1?
Menai Ala Eddine
488

Dzięki takiej funkcji:

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

Twoja tablica jest już mniej więcej obiektem, ale tablice mają pewne „interesujące” i specjalne zachowanie w odniesieniu do właściwości o nazwach całkowitych. Powyższe da ci prosty przedmiot.

edytuj och też możesz chcieć uwzględnić „dziury” w tablicy:

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

W nowoczesnych środowiskach wykonawczych JavaScript możesz użyć .reduce()metody:

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

Ten pozwala także uniknąć „dziur” w tablicy, ponieważ tak to .reduce()działa.

Pointy
źródło
2
@ m93a to już obiekt. W JavaScript nie ma sensu tworzenie instancji Array ( []), jeśli nie zamierzasz używać liczbowych kluczy właściwości i właściwości „length”.
Pointy
14
czystszy sposób na uniknięcie ponownego przypisania paramconst obj = arr.reduce((obj, cur, i) => { return { ...obj, [i]: cur }; }, {});
huygn
3
Strzałka + składnia destrukcyjna bez wyraźnego powrotu:const obj = arr.reduce((obj, cur, i) => ({ ...obj, [i]: cur }), {});
Marc Scheib
2
@eugene_sunic rzeczywiście, ale takie podejście nie było dostępne, kiedy odpowiedziałem na to w 2010 roku :)
Pointy
2
Jak wskazuje @miro, tworzenie nowego obiektu za każdym razem nie jest konieczne, a w rzeczywistości znacznie wolniejsze niż manipulowanie początkowym obiektem, który został utworzony. Uruchomienie testu JSPerf na tablicy 1000 elementów, tworzenie nowego obiektu za każdym razem jest 1000 razy wolniejsze niż mutowanie istniejącego obiektu. jsperf.com/…
romellem
281

Możesz użyć akumulatora aka 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"

Podaj pusty obiekt {}jako punkt początkowy; następnie „powiększaj” ten obiekt stopniowo. Pod koniec iteracji resultbędzie{"0": "a", "1": "b", "2": "c"}

Jeśli tablica jest zbiorem obiektów pary klucz-wartość:

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

będzie produkować: {a: 1, b: 2, c: 3}

Ze względu na kompletność, reduceRightmożesz iterować po tablicy w odwrotnej kolejności:

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

będzie produkować: {c:3, b:2, a:1}

Twój akumulator może być dowolnego rodzaju do określonego celu. Na przykład, aby zamienić klucz i wartość obiektu w tablicy, przekaż []:

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

będzie produkować: [{1: "a"}, {2: "b"}, {3: "c"}]

W przeciwieństwie do map, reducenie może być stosowany jako mapowanie 1-1. Masz pełną kontrolę nad elementami, które chcesz uwzględnić lub wykluczyć. Dlatego reducepozwala osiągnąć to filter, co czyni, co czyni reducebardzo wszechstronnym:

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

będzie produkować: [{2: "b"}, {3: "c"}]

Uwaga : reducei Object.keysą częścią ECMA 5th edition; powinieneś dostarczyć polifill dla przeglądarek, które ich nie obsługują (zwłaszcza IE8).

Zobacz domyślną implementację Mozilli .

roland
źródło
1
Pomocne w utrzymaniu sklepu redux, gdy korzystasz z mapy obiektów i musisz upuścić jeden z kluczy
dhruvpatel,
101

Jeśli używasz jquery:

$.extend({}, ['a', 'b', 'c']);
Max
źródło
4
Dziwne, jeśli podam zmienną Array, umieści każdy znak w osobnym obiekcie: 0: „a”, 1: „,”, 2: „b” ... Więc ignoruje cudzysłowy, ale zawiera przecinki. .
TrySpace
@Max Myślę, że takie zachowanie nie istnieje. Zwrócony obiekt jest {0: 'a', 1: 'b', 2: 'c'}oczekiwanym rezultatem.
ivkremer
3
Czy istnieje sposób na użycie $ .extend przy jednoczesnym informowaniu kluczy w sposób nienumeryczny, tj .: dokonywanie obliczeń na elementach tablicy?
Davi Lima
super niesamowity i krótki test
Faisal Mehmood Awan
63

Dla kompletności, rozpowszechnianie ECMAScript 2015 (ES6). Będzie wymagał transpilatora (Babel) lub środowiska z co najmniej ES6.

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

mcmhav
źródło
2
W rzeczywistości nie jest to również natywnie dostępne w ES2015. Jest jednak bardzo elegancki.
Aluan Haddad
47

Prawdopodobnie napisałbym to w ten sposób (ponieważ bardzo rzadko nie będę mieć pod ręką biblioteki underscorejs):

var _ = require('underscore');

var a = [ 'a', 'b', 'c' ];
var obj = _.extend({}, a);
console.log(obj);
// prints { '0': 'a', '1': 'b', '2': 'c' }
Dave Dopson
źródło
9
głosujesz za moją odpowiedzią, ale bez komentarza? Moja odpowiedź jest poprawna i przetestowana. Jaki jest sprzeciw?
Dave Dopson
14
To pytanie nie ma znacznika podkreślenia i zakładasz także node.js lub wymaganą bibliotekę.
David Hellsing,
10
podkreślenie jest dość powszechne zarówno na kliencie, jak i na serwerze. Zakłada się, że jest to Backbone.js i jest prawdopodobnie NAJCZĘSTSZĄ biblioteką narzędzi. Biorąc to pod uwagę, podałem wiersz wymagający, aby było jasne, że korzystam z biblioteki. Nie ma 1-linijki do opisania „dodaj underscore.js do swojej strony”, więc środowisko przeglądarki wymaga nieco tłumaczenia
Dave Dopson
6
Mimo to, jeśli używasz znaku podkreślenia, prosty obj=_.extend({},a);zrobiłby to zadanie. Ponadto, jeśli iterujesz przez tablice, powiedziałbym, że _.eachbyłoby bardziej odpowiednie niż _.map. Podsumowując, nie jest to dobra odpowiedź na kilku poziomach.
David Hellsing
4
„Musisz odpowiedzieć, nie wspominając o podkreśleniu lub zwariowaniu”, ludzie są bardzo denerwujący. Można to porównać do powiedzenia, że ​​musisz odpowiedzieć na pytania w C ++ bez wspominania o standardowych bibliotekach. Jeśli podkreślenie lub lo-dash nie jest opcją, PO powinien o tym wspomnieć.
Charlie Martin
26

Oto metoda O (1) ES2015 tylko dla kompletności.

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
źródło
(1) Według MDN zmiana [[Prototyp]] obiektu jest bardzo powolną operacją. (2) Nie usuwa to własnej lengthwłasności. (3) element jest jeszcze tablicą Array.isArray(arr) === true. (4) Specjalne zachowania tablicowe nie są usuwane, np. arr.length = 0Usuwa wszystkie indeksy. (5) Dlatego myślę, że Object.assignjest znacznie lepszy .
Oriol
1
@Oriol mdn jest niepoprawny, przynajmniej w V8 (ale także w innych silnikach) jest to dość szybka operacja w tym konkretnym przypadku - ponieważ obiekty mają magazyn numeryczny i tak, to zasadniczo zmienia dwa wskaźniki.
Benjamin Gruenbaum
Można to również wykorzystać, ponieważ jest najwyraźniej unikatowe wśród innych szybkich rozwiązań, polegające na zachowaniu w tablicy dowolnych właściwości nieindeksowanych („własnych”) (tj. Właściwości
nieujemnych
Ale hmm, Array.isArraywraca tutaj truepo „przedmiot”, chociaż instanceof Arraynie ...
Brett Zamir
@BrettZamir, który brzmi jak błąd: D
Benjamin Gruenbaum
26

Zaskoczony nie widzieć -

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

Wylliam Judd
źródło
Wszelkie mądre sugestie, aby utworzyć { "first":"a", "second":"b","third":"c" }z naprawionymi kluczami - Szukam zniszczenia
mplungjan
@mplungjan W tym przypadku sugerowałbym użycie funkcji zmniejsz zamiast przypisać. Prawdopodobnie istnieje biblioteka, która w razie potrzeby pozwala wyliczyć liczbę porządkową.
Wylliam Judd
Miałem dzisiaj inną sprawę. Skończyło się na tym, że zadałem pytanie: stackoverflow.com/questions/62197270/destruct-using-titles/…
mplungjan
23

możemy użyć funkcji Object.assigni array.reduceprzekonwertować tablicę na obiekt.

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

console.log(newObj)

KARTHIKEYAN.A
źródło
Właśnie tego szukałem. Nie potrzebowałem indków, musiałem przekształcić tablicę w zachowane pary klucz-wartość.
Mike K
18

Skończyło się na użyciu operatora rozprzestrzeniania obiektów, ponieważ jest on częścią standardu ECMAScript 2015 (ES6).

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

Jako przykład podałem następujące skrzypce .

locropulenton
źródło
1
Nie jestem pewien co do wydajności tego, ale z tak wielu konwersji Array to Object (ponieważ chcę używać obiektów dla wszystkich moich kodów w celu standaryzacji), jest to prawdopodobnie najłatwiejsze.
Ktoś Specjalny
Jak to jest lepsze niż jakakolwiek z już istniejących odpowiedzi, które dały to samo rozwiązanie?
Dan Dascalescu,
17
Object.assign({}, ['one', 'two']); // {0: 'one', 1: 'two'}

Prostym sposobem we współczesnym JavaScript jest użycie, Object.assign()które nie robi nic poza kopiowaniem klucza: wartości z jednego obiektu do drugiego. W naszym przypadku Arrayprzekazuje nieruchomości na nowy {}.

Appeiron
źródło
Jak to jest lepsze niż jakakolwiek z już istniejących odpowiedzi, które dały to samo rozwiązanie?
Dan Dascalescu,
Dan Dascalescu w tamtym czasie dodałem odpowiedź, że była tylko powyższa odpowiedź dotycząca, O.assignale brakowało wyjaśnienia. Obecnie {...array}
rozkładanie
13

W przypadku ES2016 operator rozkładania dla obiektów. Uwaga: dzieje się to po ES6, więc transpiler będzie musiał zostać dostosowany.

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

Oleksii Trekhleb
źródło
Odpowiedź operatora spreadu została już podana 2 lata wcześniej .
Dan Dascalescu,
11

Pięć lat później jest dobry sposób :)

Object.assign został wprowadzony w ECMAScript 2015.

Object.assign({}, ['a', 'b', 'c'])
// {'0':'a', '1':'b', '2':'c'}
Paul Draper
źródło
10

Za pomocą javascript#forEachjednego można to zrobić

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

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

Z ECMA6:

attributes.forEach((prop,index)=>result[index] = prop);
RIYAJ KHAN
źródło
10

FWIW, jednym z ostatnich ostatnich podejść jest użycie nowego Object.fromEntrieswraz z Object.entriesnastępującymi:

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

... co pozwala uniknąć przechowywania rzadkich elementów tablicy jako undefinedlubnull i zachowuje klucze nieindeksowane (np. nie dodatnie liczby całkowite / nienumeryczne).

Można arr.lengthjednak dodać , ponieważ nie jest to uwzględnione:

obj.length = arr.length;
Brett Zamir
źródło
9

możesz użyć operatora rozprzestrzeniania

x = [1,2,3,10]
{...x} // {0:1, 1:2, 2:3, 3:10}
Noel Zubin
źródło
1
Ta odpowiedź została już podana kilka razy.
Dan Dascalescu,
9

Jeśli używasz ES6, możesz użyć Object.assign i operatora rozkładania

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

Jeśli masz zagnieżdżoną tablicę jak

var arr=[[1,2,3,4]]
Object.assign(...arr.map(d => ({[d[0]]: d[1]})))
Murthy Naika K.
źródło
1
Nie tylko twoje nazwy zmiennych są różne, ale twój przykład nie będzie działał, tworzenie mapy z konstruktora początkowo wymaga tablicy klucz-wartość 2d. new Map([['key1', 'value1'], ['key2', 'value2']]);
Shannon Hochkins
5

Szybki i brudny:

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

while( l && (obj[--l] = arr.pop() ) ){};
Mikrofon
źródło
Myślę, że zapomniałeś tego przetestować; produkuje {0:"c", 1:"b", 2:"a"}. Możesz unshiftzamiast tego poplub (lepiej) zacząć od i=arr.length-1i zamiast tego zmniejszyć.
Phrogz,
tak .. właśnie to zmieniłem, ale potem stało się mniej interesujące: /
Mic
Mógłbym nawet zrobić l = arr.length, a potem while (l && (obj[--l] = arr.pop())){}(zdaję sobie sprawę, że to jest stare, ale dlaczego nie uprościć go jeszcze bardziej).
Qix - MONICA ZOSTAŁ SZYBOWIONY
2
@Qix, Fajne skrócenie
Mic
4

Szybki i brudny # 2:

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

while( a[i] ) { s[i] = a[i++] };
lordkrandel
źródło
Dlaczego używasz notacji przecinkowych?
Conner Ruhl
3
Osobiste preferencje, aby przecinek prowadził w następnym wierszu. Uważam, że ten zapis jest łatwiejszy do odczytania.
BingeBoy,
1
Pętla zatrzyma się, jeśli tablica zawiera wartość fałszowania. Powinieneś sprawdzić i < a.lengthzamiast a[i].
Oriol
4

Od Lodash 3.0.0 możesz używać _.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
źródło
3

Oto funkcja rekurencyjna, którą właśnie napisałem. To proste i działa dobrze.

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

Oto przykład ( 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));

Wyniki: Tablica rekurencyjna do obiektu

JVE999
źródło
Działa naprawdę dobrze. Dzięki
Hanmaslah
To powinno być wyżej, jeśli masz ['a' = '1', 'b' = '2', 'c' = '3']i chcesz, żeby {a: 1, b: 2, c: 3}to działało idealnie.
Wanjia
3
.reduce((o,v,i)=>(o[i]=v,o), {})

[dokumenty]

lub bardziej szczegółowe

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

lub

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

najkrótszy z waniliowym JS

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

bardziej złożony przykład

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

jeszcze krótszy (przy użyciu 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
źródło
Z czym miałeś zamiar [/docs]? Przydałoby się uczynienie fragmentów kodu wykonywalnymi.
Dan Dascalescu
3

Zrobiłbym to po prostu Array.of(). Tablica ma możliwość wykorzystania kontekstu jako konstruktora.

UWAGA 2 Funkcja jest celowo ogólną metodą fabryczną; nie wymaga, aby ta wartość była konstruktorem Array. Dlatego może być przenoszony lub dziedziczony przez inne konstruktory, które mogą być wywoływane za pomocą pojedynczego argumentu numerycznego.

Możemy więc powiązać Array.of()się z funkcją i wygenerować obiekt podobny do tablicy.

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

Korzystając z niej Array.of() można nawet dokonać podklasowania tablicy .

Redu
źródło
3

Jeśli możesz użyć MaplubObject.assign , jest to bardzo łatwe.

Utwórz tablicę:

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

Poniżej utworzono obiekt z indeksem jako kluczami:

Object.assign({}, languages)

Powtórz to samo co powyżej w Mapach

Konwertuje na obiekt oparty na indeksie {0 : 'css'}itp ...

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

Konwertuj na obiekt oparty na wartości {css : 'css is great'}itp ...

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

Prosta i bezczelna metoda szybkiego konwertowania tablicy przedmiotów na obiekt

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

Więc używaj go tak ...

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

Wynik:

pork pie

Sprawdzanie typu:

typeof obj
"object"

I rzeczy nie byłyby kompletne, gdyby nie było prototypowej metody

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

Za pomocą:

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

Wynik:

cheese whizz

* UWAGA: nie ma procedury nazewnictwa, więc jeśli chcesz mieć określone nazwy, musisz kontynuować korzystanie z istniejących metod poniżej.


Starsza metoda

Umożliwia to generowanie z tablicy obiektu z kluczami zdefiniowanymi w żądanej kolejności.

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); wyświetli „malować”, funkcja musi mieć tablice o równej długości lub otrzymasz pusty obiekt.

Oto zaktualizowana metoda

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
źródło
To niszczy zarówno zawartość tablicy kluczy, jak i, pomimo wewnętrznego komentarza, także tablicę wartości (jej zawartość). JavaScript działa inaczej niż PHP, a JavaScript działa automatycznie na podstawie właściwości obiektu / tablicy.
Brett Zamir
Nie, nie rutyna wykonuje kopii, oryginał nie jest dotykany.
Mark Giblin
Tak, oryginał jest dotknięty. Zobacz jsfiddle.net/bRTv7 . Długości tablic kończą się na 0.
Brett Zamir
Ok, edytowana wersja, którą właśnie zmieniłem, nie niszczy tablic, dziwne, że powinna była to zrobić.
Mark Giblin
1
Zaktualizowana metoda, która powinna być obsługiwana w starszych przeglądarkach, ponieważ JSON istnieje już dłużej niż ECMA dodała nowe funkcje kodu
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));

Albo użyj

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

Bashirpour
źródło
2

ES5 - Rozwiązanie:

Za pomocą prototypowej funkcji Array „push” i „Apply” można wypełnić obiekt elementami tablicy.

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
źródło
Co jeśli chcę przekonwertować na{ name: a, div :b, salary:c}
Prashant Pimpale
2

Więcej obsługiwanych przeglądarek i bardziej elastyczny sposób korzystania z normalnej pętli , na przykład:

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

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

Ale również nowoczesnym sposobem może być użycie operatora rozprzestrzeniania , takiego jak:

{...arr}

Lub Przypisanie obiektu :

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

Oba powrócą :

{0: "a", 1: "b", 2: "c"}
Alireza
źródło
1

Możesz użyć takiej funkcji:

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

Ten powinien efektywniej obsługiwać rzadkie tablice.

Pablo Cabrera
źródło
1

Oto rozwiązanie w coffeescript

arrayToObj = (arr) ->
  obj = {}
  for v,i in arr
    obj[i] = v if v?
  obj
David
źródło
7
Co to jest kawa? Mówimy o JS! : D
m93a
2
To mały język, który kompiluje się w JavaScript :)
David
6
Hmph, używa dziwnej notacji. Bardziej lubię zwykły JS.
m93a
2
@David Mógłbyś zrobić całą pętlę for na 1 linii, aby wszystko było tylko 3 liniami. :) Przykład:obj[i] = v for v,i in arr when v?
XåpplI'-I0llwlg'I -