823 Stimmen

Array in Objekt umwandeln

Wie kann ich am besten konvertieren?

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

zu:

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

17 Stimmen

Es ist erwähnenswert, dass Javascript-Arrays sind Objekte.

2 Stimmen

Falls noch jemand nach einer Lodash-Lösung sucht, sollten Sie Folgendes in Betracht ziehen _.keyBy (ehemals _.indexBy ): lodash.com/docs#keyBy

1 Stimmen

Dies ist ein bisschen verwirrend, weil Arrays bereits Objekte sind, aber ich denke, der Punkt der Frage ist die Umwandlung der Array exotisches Objekt zu einer gewöhnliches Objekt .

1001voto

Oriol Punkte 246798

ECMAScript 6 führt die leicht füllbare Object.assign :

En Object.assign() Methode wird verwendet, um die Werte aller aufzählbaren eigenen Eigenschaften von einem oder mehreren Quellobjekten in ein Objekt zu kopieren. Sie gibt das Zielobjekt zurück.

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

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

Sie können auch ES8 verwenden Verbreitungssyntax auf Objekte, um das gleiche Ergebnis zu erzielen:

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

Für benutzerdefinierte Schlüssel können Sie verwenden reduzieren. :

['a', 'b', 'c'].reduce((a, v) => ({ ...a, [v]: v}), {}) 
// { a: "a", b: "b", c: "c" }

557voto

Pointy Punkte 387467

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 einige "interessante" und spezielle Verhalten in Bezug auf Integer-benannte Eigenschaften. Das obige Beispiel gibt Ihnen ein einfaches Objekt.

bearbeiten Sie sollten auch die "Löcher" in der Anordnung 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 .reduce() Methode:

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

Auf diese Weise werden auch "Löcher" im Array vermieden, denn das ist die .reduce() funktioniert.

362voto

roland Punkte 7345

Sie könnten einen Akkumulator verwenden, auch bekannt als 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 wird dieses Objekt schrittweise "erweitert". Am Ende der Iterationen, result wird sein {"0": "a", "1": "b", "2": "c"}

Wenn Ihr Array ein Satz von Schlüssel-Wert-Paar-Objekten ist:

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

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

Der Vollständigkeit halber, reduceRight ermöglicht es Ihnen, Ihr Array in umgekehrter Reihenfolge zu durchlaufen:

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

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

Ihr Akkumulator kann ein beliebiger Typ für Ihren speziellen Zweck sein. Um zum Beispiel den Schlüssel und den Wert eines Objekts in einem Array zu vertauschen, ü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

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

Anders als map , reduce darf nicht als 1-1-Zuordnung verwendet werden. Sie haben die volle Kontrolle über die Elemente, die Sie ein- oder ausschließen möchten. Deshalb reduce ermöglicht es Ihnen, das zu erreichen, was filter macht, was die reduce sehr vielseitig:

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

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

Vorsicht : reduce y Object.key sind Teil von ECMA 5th edition Sie sollten ein Polyfill für Browser bereitstellen, die sie nicht unterstützen (vor allem IE8).

Siehe eine Standardimplementierung von Mozilla .

106voto

Max Punkte 11038

Wenn Sie Jquery verwenden:

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

75voto

mcmhav Punkte 943

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

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X