Comment convertir un tableau d'objets en un seul objet en JavaScript?


102

J'ai un tableau d'objets:

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

Comment puis-je le convertir en JavaScript?

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

Réponses:


52

Vous recherchez probablement quelque chose comme ceci:

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


2
Découvrez la réponse de FirstOne pour une approche moderne.
Tibos

134

La petite solution ES6 peut ressembler à:

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)

De plus, si vous utilisez la propagation d'objets, cela peut ressembler à:

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

Une autre solution qui est 99% plus rapide est (testé sur jsperf):

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

Ici, nous bénéficions de l'opérateur virgule, il évalue toutes les expressions avant la virgule et renvoie une dernière (après la dernière virgule). Nous ne copions donc pas à objchaque fois, nous lui attribuons plutôt une nouvelle propriété.


2
J'ai adoré celui! var object = arr.reduce((obj, item) => (obj[item.key] = item.value, obj) ,{});
Sohail

est-ce une ligne plus rapide ou la boucle conventionnelle?
Jeb50

2
@ Jeb50, la boucle conventionnelle est la plus rapide, mais pas de beaucoup sur l'opérateur virgule. Object.assign / spread operator est un ordre de grandeur plus lent: jsperf.com/comma-operator-js
Josh Geller

1
Vous avez oublié de diffuser le deuxième objet({...obj, ...{[item.key]: item.value}}) ,{});
Julia

Merci, envelopper ceci dans un objet n'est en fait pas nécessaire. Je l'ai réparé.
Shevchenko Viktor le

59

J'aime l'approche fonctionnelle pour réaliser cette tâche:

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

Remarque: Last {}est la objvaleur initiale de la fonction de réduction, si vous ne fournissez pas la valeur initiale, le premier arrélément sera utilisé (ce qui n'est probablement pas souhaitable).

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


2
et si la clé est dynamique?
Stefano Saitta le

1
Eh bien, vous devez savoir quelle propriété de l'élément / objet donné doit être utilisée comme clé et quelle propriété non? Mais si nous supposons que wfirst prop est toujours la clé et ensuite la valeur, nous pourrions utiliser une fonction de rappel comme celle-ci: function (obj, item) {var keys = item.keys (); obj [élément [clés [0]]] = élément [clés [0]]; return obj; }
GreQ

Correction du callback ci-dessus: code var obj = arr.reduce (function (obj, item) {var keys = Object.keys (item); obj [item [keys [0]]] = item [keys [1]]; return obj;}, {});
GreQ

58

Essayer de résoudre cette réponse dans Comment convertir un tableau d'objets en un seul objet en JavaScript? ,

cela devrait le faire:

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


Bon mot:

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

18

Utilisation d' 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);


12

Une façon simple de le faire en utilisant JavaScript moderne est la suivante:

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


5

Sur la base des réponses suggérées par de nombreux auteurs, j'ai créé un scénario de test JsPref. https://jsperf.com/array2object82364

Voici les captures d'écran des performances. C'est un peu choquant pour moi de voir, le résultat du chrome est en contraste avec Firefox et Edge, même après l'avoir exécuté plusieurs fois.

Bord

Firefox

Chrome


2

Utilisation de 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

Mise à jour: le monde ne cessait de tourner. Utilisez plutôt une approche fonctionnelle.

Voici:

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

Cela ressemble étonnamment à la réponse publiée par quelqu'un comme il y a 5 minutes
Alexander

1
Parce que c'est ainsi que vous résolvez ce problème. À propos de la dénomination par exemple: arrayest un mot-clé réservé que les gens utilisent à la arrplace. etc.
pstadler

0

Voici comment accepter dynamiquement ce qui précède en tant que chaîne et l'interpoler dans un objet:

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)


Bien que cela puisse répondre à la question, il est préférable d'ajouter une description de la façon dont cette réponse peut aider à résoudre le problème. Veuillez lire Comment rédiger une bonne réponse pour en savoir plus.
Roshana Pitigala le

0

Vous pouvez utiliser la fonction lodash mapKeys pour cela. Juste une ligne de code!

Veuillez vous référer à cet exemple de code complet (copier-coller ceci dans repl.it ou similaire):

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');
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.