Array in Objekt konvertieren

514

Was ist der beste Weg, um zu konvertieren:

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

zu:

{
  0: 'a',
  1: 'b',
  2: 'c'
}
David Hellsing
quelle
3
Vielleicht braucht er einen Enten-Tippcode, um nicht zu glauben, dass es sich um eine Array-Instanz handelt
Pointy,
6
Seine erwähnenswert, dass Javascript - Arrays sind Objekte.
Spudley
Wenn jemand nach einer Lodash-Lösung sucht, ziehen Sie _.keyBy(früher _.indexBy) Folgendes in
2540625
Dies ist etwas verwirrend, da Arrays bereits Objekte sind, aber ich denke, der Sinn der Frage besteht darin, das exotische Array- Objekt in ein gewöhnliches Objekt umzuwandeln .
Oriol
1
Ein einfacher Weg, dies mit Lodash zu tun, ist _.toPlainObject. Beispiel:var myObj = _.toPlainObject(myArr)
Julian Soro

Antworten:

473

ECMAScript 6 führt das leicht polyfüllbare ein Object.assign:

Die Object.assign()Methode wird verwendet, um die Werte aller aufzählbaren eigenen Eigenschaften von einem oder mehreren Quellobjekten in ein Zielobjekt zu kopieren. Das Zielobjekt wird zurückgegeben.

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

Die eigene lengthEigenschaft des Arrays wird nicht kopiert, da sie nicht aufzählbar ist.

Sie können auch die ES6- Spread-Syntax verwenden , um das gleiche Ergebnis zu erzielen:

{ ...['a', 'b', 'c'] }
Oriol
quelle
Ich möchte nur darauf hinweisen - wenn Sie bereits ein Array mit sortierten Eigenschaften des ursprünglichen Objekts haben, wird dieses Array mithilfe des Spread- Operators direkt in ein neues Objekt umgewandelt:{ ...[sortedArray]}
HappyHands31
Oriol, gibt es eine Möglichkeit, einen festen Schlüssel anstelle von 0 & 1 festzulegen?
Menai Ala Eddine
488

Mit einer Funktion wie dieser:

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

Ihr Array ist bereits mehr oder weniger nur ein Objekt, aber Arrays haben ein "interessantes" und spezielles Verhalten in Bezug auf Eigenschaften mit ganzzahligen Namen. Das Obige gibt Ihnen ein einfaches Objekt.

edit oh auch du möchtest vielleicht "Löcher" im Array berücksichtigen:

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

In modernen JavaScript-Laufzeiten können Sie die folgende .reduce()Methode verwenden:

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

Das vermeidet auch "Löcher" im Array, denn so .reduce()funktioniert es.

Spitze
quelle
2
@ m93a es ist schon ein objekt. In JavaScript macht es keinen Sinn, eine Array-Instanz ( []) zu erstellen, wenn Sie keine numerischen Eigenschaftsschlüssel und die Eigenschaft "length" verwenden.
Pointy
14
sauberer Weg, um Parameter neu const obj = arr.reduce((obj, cur, i) => { return { ...obj, [i]: cur }; }, {});
zuzuweisen
3
Pfeil + Destrukturierungssyntax ohne explizite Rückgabe:const obj = arr.reduce((obj, cur, i) => ({ ...obj, [i]: cur }), {});
Marc Scheib
2
@ Eugene_sunic in der Tat, aber dieser Ansatz war nicht verfügbar, als ich dies im Jahr 2010 beantwortete :)
Pointy
2
Wie @miro hervorhebt, ist es nicht erforderlich, jedes Mal ein neues Objekt zu erstellen, und zwar viel langsamer als die Bearbeitung des ursprünglich erstellten Objekts. Das Ausführen eines JSPerf-Tests für ein Array von 1000 Elementen und das Erstellen eines neuen Objekts ist jedes Mal 1000- mal langsamer als das Mutieren des vorhandenen Objekts. jsperf.com/…
Romellem
281

Sie könnten einen Akku aka verwenden 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"

Übergeben Sie ein leeres Objekt {}als Ausgangspunkt. dann "erweitern" Sie dieses Objekt schrittweise. Am Ende der Iterationen resultwird{"0": "a", "1": "b", "2": "c"}

Wenn Ihr Array aus einer Reihe von Schlüssel-Wert-Paar-Objekten besteht:

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

wird herstellen: {a: 1, b: 2, c: 3}

Der Vollständigkeit halber reduceRightkönnen Sie Ihr Array in umgekehrter Reihenfolge durchlaufen:

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

wird herstellen: {c:3, b:2, a:1}

Ihr Akku kann für Ihren speziellen Zweck von einem beliebigen Typ sein. Um beispielsweise den Schlüssel und den Wert Ihres Objekts in einem Array auszutauschen, übergeben Sie []:

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

wird herstellen: [{1: "a"}, {2: "b"}, {3: "c"}]

Im Gegensatz zu map, reducekann nicht als 1-1 - Mapping verwendet werden. Sie haben die volle Kontrolle über die Elemente, die Sie ein- oder ausschließen möchten. So reducekönnen Sie erreichen, was filterfunktioniert, was reducesehr vielseitig macht :

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

wird herstellen: [{2: "b"}, {3: "c"}]

Achtung : reduceund Object.keysind Teil von ECMA 5th edition; Sie sollten eine Polyfüllung für Browser bereitstellen, die diese nicht unterstützen (insbesondere IE8).

Siehe eine Standardimplementierung von Mozilla .

Roland
quelle
1
Hilfreich bei der Pflege eines Redux-Speichers, wenn Sie eine Karte mit Objekten verwenden und einen der Schlüssel
ablegen müssen
101

Wenn Sie jquery verwenden:

$.extend({}, ['a', 'b', 'c']);
Max
quelle
4
Seltsam, wenn ich eine Array-Variable gebe, wird jedes Zeichen in ein separates Objekt eingefügt: 0: "a", 1: ",", 2: "b" ... Also werden die Anführungszeichen ignoriert, aber die Kommas eingeschlossen. .
TrySpace
@ Max Ich denke, es gibt kein solches Verhalten. Das zurückgegebene Objekt ist {0: 'a', 1: 'b', 2: 'c'}das erwartete Ergebnis.
ivkremer
3
Gibt es eine Möglichkeit, $ .extend zu verwenden und gleichzeitig die Schlüssel nicht numerisch zu informieren, dh: Berechnungen für die Array-Elemente durchzuführen?
Davi Lima
super toller und kurzer Test
Faisal Mehmood Awan
63

Der Vollständigkeit halber verbreitet sich ECMAScript 2015 (ES6). Benötigt entweder einen Transpiler (Babel) oder eine Umgebung mit mindestens ES6.

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

mcmhav
quelle
2
Tatsächlich ist dies auch in ES2015 nicht nativ verfügbar. Es ist jedoch sehr elegant.
Aluan Haddad
47

Ich würde es wahrscheinlich so schreiben (da ich sehr selten nicht die Unterstrichbibliothek zur Hand habe):

var _ = require('underscore');

var a = [ 'a', 'b', 'c' ];
var obj = _.extend({}, a);
console.log(obj);
// prints { '0': 'a', '1': 'b', '2': 'c' }
Dave Dopson
quelle
9
Sie haben meine Antwort abgelehnt, aber keinen Kommentar? Meine Antwort ist richtig und geprüft. Was ist der Einwand?
Dave Dopson
14
Diese Frage hat kein Unterstrich-Tag, und Sie gehen auch von node.js oder einer erforderlichen Bibliothek aus.
David Hellsing
10
Unterstriche sind sowohl auf dem Client als auch auf dem Server ziemlich häufig. Es wird für Backbone.js angenommen und ist wahrscheinlich DIE häufigste Dienstprogrammbibliothek. Davon abgesehen habe ich die Require-Zeile eingefügt, um zu verdeutlichen, dass ich eine Bibliothek verwendet habe. Es gibt keinen 1-Liner für die Beschreibung von "add underscore.js to your page", daher ist für eine Browserumgebung eine Übersetzung erforderlich
Dave Dopson,
6
Wenn Sie jedoch undserscore verwenden, würde ein einfacher obj=_.extend({},a);den Job erledigen. Auch wenn Sie durch Arrays iterieren, _.eachwürde ich sagen, wäre angemessener als _.map. Alles in allem ist dies auf mehreren Ebenen keine gute Antwort.
David Hellsing
4
Die Leute "Sie müssen antworten, ohne Unterstrich oder Strich zu erwähnen" sind so nervig. Vergleichbar mit der Aussage, dass Sie C ++ - Fragen beantworten müssen, ohne die Standardbibliotheken zu erwähnen. Wenn Unterstrich oder Lo-Dash keine Option sind, sollte das OP dies erwähnen.
Charlie Martin
26

Hier ist der Vollständigkeit halber eine O (1) ES2015-Methode.

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
quelle
(1) Laut MDN ist das Ändern des Prototyps eines Objekts eine sehr langsame Operation. (2) Das eigene lengthEigentum wird dadurch nicht entfernt . (3) Das Objekt ist immer noch ein Array Array.isArray(arr) === true. (4) Spezielle Array-Verhaltensweisen werden nicht entfernt, z arr.length = 0. B. werden alle Indizes entfernt. (5) Daher denke ich, dass Object.assignes viel besser ist .
Oriol
1
@Oriol mdn ist falsch, zumindest in V8 (aber auch in anderen Engines) ist dies in diesem speziellen Fall eine ziemlich schnelle Operation - da Objekte ohnehin einen numerischen Speicher haben, werden im Grunde genommen zwei Zeiger geändert.
Benjamin Gruenbaum
Dies kann auch für die Tatsache verwendet werden, dass es unter den anderen schnellen Lösungen anscheinend einzigartig ist, alle nicht indexierten ("eigenen") Eigenschaften des Arrays (dh nicht positiv-ganzzahlige Eigenschaften)
beizubehalten
Aber hmm, Array.isArraykehrt truefür das "Objekt" hier zurück, obwohl instanceof Arraynicht ...
Brett Zamir
@ BrettZamir, das klingt wie ein Fehler: D
Benjamin Gruenbaum
26

Überrascht nicht zu sehen -

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

Wylliam Judd
quelle
Jeder kluge Vorschlag, { "first":"a", "second":"b","third":"c" }mit den Schlüsseln zu erstellen, die
repariert werden
@mplungjan Ich würde vorschlagen, in diesem Fall reduzieren statt zuweisen zu verwenden. Es gibt wahrscheinlich eine Bibliothek, mit der Sie bei Bedarf über jede Ordnungszahl aufzählen können.
Wylliam Judd
Ich hatte heute einen anderen Fall. Am
mplungjan
23

Wir können verwenden Object.assignund array.reducefunktionieren, um ein Array in ein Objekt zu konvertieren.

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

console.log(newObj)

KARTHIKEYAN.A
quelle
Das habe ich gesucht. Ich brauchte die Indeces nicht, ich musste das Array in beibehaltene Schlüssel-Wert-Paare umwandeln.
Mike K
18

Am Ende habe ich den Object Spread Operator verwendet, da dieser Teil des ECMAScript 2015 (ES6) -Standards ist.

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

Habe die folgende Geige als Beispiel gemacht.

locropulenton
quelle
1
Ich bin mir über die Leistung nicht sicher, aber von so vielen Array-zu-Objekt-Konvertierungen (da ich Objekte für alle meine Codes verwenden möchte, um sie zu standardisieren) ist dies wahrscheinlich die einfachste.
Jemand Besonderes
Wie ist dies besser als eine der bereits vorhandenen Antworten, die dieselbe Lösung lieferten?
Dan Dascalescu
17
Object.assign({}, ['one', 'two']); // {0: 'one', 1: 'two'}

In modernem JavaScript ist es einfach, Object.assign()nur den Schlüssel zu kopieren: Wert von einem Objekt auf ein anderes. In unserem Fall Arrayspendet Immobilien an neue {}.

Appeiron
quelle
Wie ist dies besser als eine der bereits vorhandenen Antworten, die dieselbe Lösung lieferten?
Dan Dascalescu
Dan Dascalescu zu der Zeit, als ich eine Antwort hinzugefügt habe, gab es nur die obige Antwort bezüglich, O.assignaber es fehlte eine Erklärung. Heutzutage ist die Zerstörung eines Arrays in ein Objekt ein Weg ( {...array})
Appeiron
13

Spreizen Sie für ES2016 den Operator für Objekte. Hinweis: Dies ist nach ES6 und daher muss der Transpiler angepasst werden.

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

Oleksii Trekhleb
quelle
Die Antwort des Spread-Betreibers wurde bereits 2 Jahre zuvor gegeben .
Dan Dascalescu
11

Fünf Jahre später gibt es einen guten Weg :)

Object.assign wurde in ECMAScript 2015 eingeführt.

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

Mit javascript#forEacheinem kann man das machen

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

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

Mit ECMA6:

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

FWIW, ein anderer neuerer Ansatz besteht darin, das Neue Object.fromEntrieszusammen mit Object.entrieswie folgt zu verwenden:

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

... wodurch vermieden wird, spärliche Array-Elemente als undefinedoder zu speichern nullund nicht indexierte (z. B. nicht positive Ganzzahl- / nicht numerische) Schlüssel beizubehalten.

Man kann jedoch hinzufügen arr.length, da dies nicht enthalten ist:

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

Sie können den Spread-Operator verwenden

x = [1,2,3,10]
{...x} // {0:1, 1:2, 2:3, 3:10}
noel zubin
quelle
1
Diese Antwort wurde bereits mehrmals gegeben.
Dan Dascalescu
9

Wenn Sie ES6 verwenden, können Sie Object.assign und den Spread-Operator verwenden

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

Wenn Sie Array wie verschachtelt haben

var arr=[[1,2,3,4]]
Object.assign(...arr.map(d => ({[d[0]]: d[1]})))
murthy naika k
quelle
1
Ihre Variablennamen unterscheiden sich nicht nur, Ihr Beispiel funktioniert auch nicht. Für die Erstellung einer Map aus dem Konstruktor ist zunächst ein 2d-Schlüsselwert-Array erforderlich. new Map([['key1', 'value1'], ['key2', 'value2']]);
Shannon Hochkins
5

Eine schnelle und schmutzige:

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

while( l && (obj[--l] = arr.pop() ) ){};
Mic
quelle
Ich denke, Sie haben vergessen, das zu testen. es produziert {0:"c", 1:"b", 2:"a"}. Sie möchten unshiftstattdessen statt popoder (besser) mit beginnen i=arr.length-1und stattdessen dekrementieren.
Phrogz
yeah .. habe es gerade geändert, aber dann wird es weniger interessant: /
Mic
Könnte es sogar tun l = arr.lengthund dann while (l && (obj[--l] = arr.pop())){}(mir ist klar, dass dies alt ist, aber warum nicht noch weiter vereinfachen).
Qix - MONICA wurde
2
@ Qix, schöne Verkürzung
Mic
4

Schnell und schmutzig # 2:

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

while( a[i] ) { s[i] = a[i++] };
Lordkrandel
quelle
Warum verwenden Sie die Komma-Notation?
Conner Ruhl
3
Persönliche Präferenz dafür, dass das Komma in der nächsten Zeile steht. Ich finde diese Notation leichter zu lesen.
BingeBoy
1
Die Schleife wird gestoppt, wenn das Array einen falschen Wert enthält. Sie sollten überprüfen , i < a.lengthstatt a[i].
Oriol
4

Ab Lodash 3.0.0 können Sie _.toPlainObject verwenden

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

acontell
quelle
3

Hier ist eine rekursive Funktion, die ich gerade geschrieben habe. Es ist einfach und funktioniert gut.

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

Hier ist ein Beispiel ( 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));

Ergebnisse: Rekursives Array zum Objekt

JVE999
quelle
Funktioniert sehr gut. Danke
Hanmaslah
Dies sollte höher sein, wenn Sie haben ['a' = '1', 'b' = '2', 'c' = '3']und wollen, dass {a: 1, b: 2, c: 3}dies perfekt funktioniert.
Wanjia
3
.reduce((o,v,i)=>(o[i]=v,o), {})

[docs]

oder ausführlicher

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

oder

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

kürzeste mit Vanille JS

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

ein komplexeres Beispiel

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

noch kürzer (mit 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
quelle
Was hast du vor [/docs]? Es wäre sinnvoller, die Codefragmente ausführbar zu machen.
Dan Dascalescu
3

Ich würde das einfach mit machen Array.of(). Array of kann den Kontext als Konstruktor verwenden.

ANMERKUNG 2 Die of-Funktion ist eine absichtlich generische Factory-Methode. Es ist nicht erforderlich, dass dieser Wert der Array-Konstruktor ist. Daher kann es an andere Konstruktoren übertragen oder von diesen geerbt werden, die mit einem einzigen numerischen Argument aufgerufen werden können.

Wir können uns also Array.of()an eine Funktion binden und ein Array-ähnliches Objekt generieren.

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

Durch die Verwendung Array.of() kann man sogar eine Array-Unterklassifizierung durchführen .

Reduzieren
quelle
3

Wenn Sie Mapoder verwenden können Object.assign, ist es sehr einfach.

Erstellen Sie ein Array:

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

Im Folgenden wird ein Objekt mit Index als Schlüssel erstellt:

Object.assign({}, languages)

Replizieren Sie dasselbe wie oben mit Maps

Konvertiert in ein indexbasiertes Objekt {0 : 'css'}usw.

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

In ein wertbasiertes Objekt konvertieren {css : 'css is great'}etc ...

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

Eine einfache und freche Methode, um ein Array von Elementen schnell in ein Objekt umzuwandeln

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

Dann benutze es so ...

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

Ausgabe:

pork pie

Überprüfen des Typs:

typeof obj
"object"

UND die Dinge wären nicht vollständig, wenn es keine Prototypmethode gäbe

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

Verwenden von like:

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

Ausgabe:

cheese whizz

* HINWEIS: Es gibt keine Benennungsroutine. Wenn Sie also bestimmte Namen haben möchten, müssen Sie die vorhandenen Methoden weiter unten verwenden.


Ältere Methode

Auf diese Weise können Sie aus einem Array ein Objekt mit Schlüsseln generieren, die Sie in der gewünschten Reihenfolge definieren.

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); Gibt "paint" aus, muss die Funktion gleich lange Arrays haben, sonst erhalten Sie ein leeres Objekt.

Hier ist eine aktualisierte Methode

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
quelle
Dies zerstört sowohl den Inhalt des Schlüsselarrays als auch trotz des internen Kommentars auch das Wertearray (dessen Inhalt). JavaScript funktioniert anders als PHP, wobei JavaScript automatisch als Referenz auf die Eigenschaften eines Objekts / Arrays wirkt.
Brett Zamir
Nein, die Routine erstellt Kopien, das Original wird nicht berührt.
Mark Giblin
Ja, das Original wird berührt. Siehe jsfiddle.net/bRTv7 . Die Array-Längen sind beide 0.
Brett Zamir
Ok, die bearbeitete Version, mit der ich sie gerade geändert habe, zerstört die Arrays nicht. Findet das seltsam, dass es das hätte tun sollen.
Mark Giblin
1
Aktualisierte Methode, die in älteren Browsern unterstützt werden sollte, da es JSON schon länger gibt als ECMA neue Codefunktionen hinzugefügt hat
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));

Oder verwenden

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

Bashirpour
quelle
2

ES5 - Lösung:

Mit den Array- Prototypfunktionen 'push' und 'apply' können Sie das Objekt mit den Array-Elementen füllen.

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
quelle
Was ist, wenn ich konvertieren möchte zu{ name: a, div :b, salary:c}
Prashant Pimpale
2

Eine vom Browser unterstützte und flexiblere Methode besteht darin, eine normale Schleife zu verwenden , etwa:

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

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

Aber auch die moderne Art könnte den Spread-Operator verwenden , wie:

{...arr}

Oder Objekt zuweisen :

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

Beide werden zurückkehren :

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

Sie könnten eine Funktion wie diese verwenden:

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

Dieser sollte spärliche Arrays effizienter handhaben.

Pablo Cabrera
quelle
1

Hier ist eine Lösung in Coffeescript

arrayToObj = (arr) ->
  obj = {}
  for v,i in arr
    obj[i] = v if v?
  obj
David
quelle
7
Was ist Coffeescript? Wir sprechen über JS! : D
m93a
2
Es ist eine kleine Sprache, die in JavaScript kompiliert wird :)
David
6
Hmph, es verwendet seltsame Notation. Ich mag einfaches JS mehr.
M93a
2
@ David Du könntest die gesamte for-Schleife in 1 Zeile machen, um das Ganze nur in 3 Zeilen zu machen. :) Beispiel:obj[i] = v for v,i in arr when v?
XåpplI'-I0llwlg'I -