Wie konvertiere ich ein Array von Objekten in ein Objekt in JavaScript?


93

Ich habe eine Reihe von Objekten:

[ 
  { key : '11', value : '1100', $$hashKey : '00X' },
  { key : '22', value : '2200', $$hashKey : '018' }
];

Wie konvertiere ich es per JavaScript in das Folgende?

{
  "11": "1000",
  "22": "2200"
}

4
[{key:"11", value:"1100"}, {key:"22", value:"2200"}].reduce(function(m,v){m[v.key] = v.value; return m;}, {})
David

Antworten:


49

Sie suchen wahrscheinlich nach so etwas:

// original
var arr = [ 
  {key : '11', value : '1100', $$hashKey : '00X' },
  {key : '22', value : '2200', $$hashKey : '018' }
];

//convert
var result = {};
for (var i = 0; i < arr.length; i++) {
  result[arr[i].key] = arr[i].value;
}

console.log(result);


1
Schauen Sie sich die Antwort von FirstOne für einen modernen Ansatz an.
Tibos

122

Eine winzige ES6-Lösung kann folgendermaßen aussehen:

var arr = [{key:"11", value:"1100"},{key:"22", value:"2200"}];
var object = arr.reduce(
  (obj, item) => Object.assign(obj, { [item.key]: item.value }), {});

console.log(object)

Wenn Sie die Objektverteilung verwenden, kann dies folgendermaßen aussehen:

var object = arr.reduce((obj, item) => ({...obj, [item.key]: item.value}) ,{});

Eine weitere Lösung, die 99% schneller ist, ist (auf jsperf getestet):

var object = arr.reduce((obj, item) => (obj[item.key] = item.value, obj) ,{});

Hier profitieren wir vom Komma-Operator, der alle Ausdrücke vor dem Komma auswertet und einen letzten (nach dem letzten Komma) zurückgibt. Wir kopieren also nicht objjedes Mal, sondern weisen ihm eine neue Eigenschaft zu.


2
Liebte den! var object = arr.reduce((obj, item) => (obj[item.key] = item.value, obj) ,{});
Sohail

Ist diese eine Zeile schneller oder die herkömmliche Schleife?
Jeb50

2
@ Jeb50, konventionelle Schleife ist die schnellste, aber nicht viel über dem Komma-Operator. Der Object.assign / Spread-Operator ist um eine Größenordnung langsamer: jsperf.com/comma-operator-js
Josh Geller

1
Sie haben vergessen, das zweite Objekt zu verbreiten({...obj, ...{[item.key]: item.value}}) ,{});
Julia

Vielen Dank, das Einwickeln in ein Objekt ist eigentlich nicht erforderlich. Ich habe es repariert.
Shevchenko Viktor

57

Ich mag den funktionalen Ansatz, um diese Aufgabe zu erreichen:

var arr = [{ key:"11", value:"1100" }, { key:"22", value:"2200" }];
var result = arr.reduce(function(obj,item){
  obj[item.key] = item.value; 
  return obj;
}, {});

Hinweis: Last {}ist der Anfangswert objfür die Reduzierungsfunktion. Wenn Sie den Anfangswert nicht angeben, wird das erste arrElement verwendet (was wahrscheinlich unerwünscht ist).

https://jsfiddle.net/GreQ/2xa078da/


2
und ob der Schlüssel dynamisch ist?
Stefano Saitta

1
Nun, Sie sollten wissen, welche Eigenschaft des angegebenen Elements / Objekts als Schlüssel und welche als Wert Nr. Verwendet werden soll. Wenn wir jedoch annehmen, dass die erste Stütze immer der Schlüssel und die zweite der Wert ist, könnten wir eine Rückruffunktion wie diese verwenden: function (obj, item) {var keys = item.keys (); obj [item [keys [0]]] = item [keys [0]]; return obj; }
GreQ

Korrektur des obigen Rückrufs: Code var obj = arr.reduce (Funktion (obj, Element) {var keys = Object.keys (Element); obj [Element [Schlüssel [0]]] = Element [Schlüssel [1]]; Rückgabe obj;}, {});
GreQ

53

Der Versuch, diese Antwort in Wie konvertiere ich ein Array von Objekten in ein Objekt in JavaScript? ,

das sollte es tun:

var array = [
    {key:'k1',value:'v1'},
    {key:'k2',value:'v2'},
    {key:'k3',value:'v3'}
];
var mapped = array .map(item => ({ [item.key]: item.value }) );
var newObj = Object.assign({}, ...mapped );
console.log(newObj );


Einzeiler:

var newObj = Object.assign({}, ...(array.map(item => ({ [item.key]: item.value }) )));

16

Verwenden von Object.fromEntries :

const array = [
    { key: "key1", value: "value1" },
    { key: "key2", value: "value2" },
];

const obj = Object.fromEntries(array.map(item => [item.key, item.value]));

console.log(obj);


11

Ein sauberer Weg, dies mit modernem JavaScript zu tun, ist wie folgt:

const array = [
  { name: "something", value: "something" },
  { name: "somethingElse", value: "something else" },
];

const newObject = Object.assign({}, ...array.map(item => ({ [item.name]: item.value })));

// >> { something: "something", somethingElse: "something else" }


4

Basierend auf den Antworten vieler Autoren habe ich ein JsPref-Testszenario erstellt. https://jsperf.com/array2object82364

Unten finden Sie die Screenshots der Leistung. Es ist ein wenig schockierend für mich zu sehen, dass das Chromergebnis im Gegensatz zu Firefox und Edge steht, auch wenn es mehrmals ausgeführt wurde.

Kante

Feuerfuchs

Chrom


2

Verwenden von Underscore.js :

var myArray = [
  Object { key="11", value="1100", $$hashKey="00X"},
  Object { key="22", value="2200", $$hashKey="018"}
];
var myObj = _.object(_.pluck(myArray, 'key'), _.pluck(myArray, 'value'));

2

Update: Die Welt drehte sich weiter. Verwenden Sie stattdessen einen funktionalen Ansatz.

Bitte schön:

var arr = [{ key: "11", value: "1100" }, { key: "22", value: "2200" }];
var result = {};
for (var i=0, len=arr.length; i < len; i++) {
    result[arr[i].key] = arr[i].value;
}
console.log(result); // {11: "1000", 22: "2200"}

Dies ähnelt überraschenderweise der Antwort, die jemand vor 5 Minuten gepostet hat
Alexander

1
Denn so lösen Sie dieses Problem. Über die Benennung zum Beispiel: arrayist ein reserviertes Schlüsselwort, das arrstattdessen verwendet wird. usw.
Pstadler

0

So akzeptieren Sie das oben Gesagte dynamisch als Zeichenfolge und interpolieren es in ein Objekt:

var stringObject = '[Object { key="11", value="1100", $$hashKey="00X"}, Object { key="22", value="2200", $$hashKey="018"}]';

function interpolateStringObject(stringObject) {
  var jsObj = {};
  var processedObj = stringObject.split("[Object { ");
  processedObj = processedObj[1].split("},");
  $.each(processedObj, function (i, v) {
      jsObj[v.split("key=")[1].split(",")[0]] = v.split("value=")[1].split(",")[0].replace(/\"/g,'');
  });

  return jsObj
}

var t = interpolateStringObject(stringObject); //t is the object you want

http://jsfiddle.net/3QKmX/1/


0

// original
var arr = [{
    key: '11',
    value: '1100',
    $$hashKey: '00X'
  },
  {
    key: '22',
    value: '2200',
    $$hashKey: '018'
  }
];

// My solution
var obj = {};
for (let i = 0; i < arr.length; i++) {
  obj[arr[i].key] = arr[i].value;
}
console.log(obj)


Während dies die Frage beantworten kann, ist es besser, eine Beschreibung hinzuzufügen, wie diese Antwort zur Lösung des Problems beitragen kann. Bitte lesen Sie Wie schreibe ich eine gute Antwort , um mehr zu erfahren ?
Roshana Pitigala

0

Sie können dafür die mapKeys lodash-Funktion verwenden. Nur eine Codezeile!

Bitte beziehen Sie sich auf dieses vollständige Codebeispiel (Kopieren, Einfügen in repl.it oder ähnliches):

import _ from 'lodash';
// or commonjs:
// const _ = require('lodash');

let a = [{ id: 23, title: 'meat' }, { id: 45, title: 'fish' }, { id: 71, title: 'fruit' }]
let b = _.mapKeys(a, 'id');
console.log(b);
// b:
// { '23': { id: 23, title: 'meat' },
//   '45': { id: 45, title: 'fish' },
//   '71': { id: 71, title: 'fruit' } }

-2
        var obj = [
            {id: 1 , name : 'gaju' , class : 'kv'},
            {id: 2 , name : 'tushar' , class : 'Super'}
        ];

        function conv(obj,arg){
        var temp= {};
        var output= {}
        for(key in obj){
        temp[key] = obj[key];
        };

        var i=0;
        for(key in temp){
        var aa = {};
        var value = temp[key][arg];
        aa[value] = temp[i];
        //console.log(aa[value][arg] );
        output[aa[value][arg]]=  aa[value];
        i++;
        }

       console.log(output); 
        }

calling function 

    conv(obj,'class');
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.