2017-08-24 3 views
-2

Je cherche essentiellement un moyen rapide de le faire en javascript:Convertir un tableau d'objets dans un objet d'objets tels que les nouveaux objets sont désignés par l'un de leurs biens

let arr = [{key: "alpha", value: "2", property1: "some"},{key:"beta", value:"3", property1: "extra", property2: "property"},{key: "gamma", value: "4"}]; 
let obj = someFunction(arr); 
// WANTED RESULT: 
//obj is now { "alpha" : { value: "2", property1: "some" }, "beta" : {value: "3", property1: "extra", property2: "property",} , "gamma": {value: "4"} } 

Chaque objet dans le tableau peut avoir plus de propriétés, et différentes, sauf pour la clé.

Edit: C'est ce que j'ai fait. Il laisse toujours une propriété sur les objets, et je ne suis pas sûr que ce/looping soit le moyen le plus efficace.

tempObj = {}; 
for (let i = 0; i < arr.length; i++) { 
    tempObj[arr[i].key] = arr[i]; 
} 
//this will give this answer, close enough to what I want: 
//{ alpha: {key: "alpha", value: "2", property1: "some"}, beta: key:"beta", value:"3", property1: "extra", property2: "property", gamma: {key: "gamma", value: "4"} } 
+3

s'il vous plaît montrer ce que vous avez essayé – marvel308

+0

s'il vous plaît ajouter le résultat voulu ainsi. –

+0

{"alpha": {value: "2", property1: "quelques"}, "beta": {value: "3", property1: "extra", property2: "propriété",}, "gamma": { value: "4"}} – amp

Répondre

0

Vous pouvez le faire de cette façon

let arr = [{key: "alpha", value: "2", property1: "some"},{key:"beta", value:"3", property1: "extra", property2: "property"},{key: "gamma", value: "4"}]; 
 

 
let result = {}; 
 

 
for(let element of arr){ 
 
    result[element.key] = element; 
 
} 
 

 
console.log(result);

+0

Désolé, je viens de mettre à jour ma question. Chaque objet dans le tableau est complexe et nous avons seulement la garantie que 1 propriété "clé" est la même pour tous. – amp

+0

J'ai mis à jour ma réponse, est-ce que cela fonctionne pour vous? – marvel308

+0

Je viens de mettre à jour votre code avec un tableau légèrement différent - je peux travailler avec les résultats (mon propre code me donne la même sortie) mais ne le réduit pas à ce que je veux exactement – amp

0

Vous pouvez utiliser Object.assign pour l'attribution de nouvelles propriétés avec un nouvel objet tout en itérer.

var array = [{ key: "alpha", value: "2", property1: "some" }, { key: "beta", value: "3", property1: "extra", property2: "property" }, { key: "gamma", value: "4" }], 
 
    object = array.reduce((r, o) => 
 
     Object.assign(r, { 
 
      [o.key]: Object.keys(o) 
 
       .reduce((s, k) => Object.assign(s, k !== 'key' ? { [k]: o[k] } : {}), {}) 
 
      }), 
 
     {}); 
 

 
console.log(object);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

Désolé, je viens de mettre à jour ma question. Chaque objet dans le tableau est complexe et nous avons seulement la garantie que 1 propriété "clé" est la même pour tous. – amp

1

cela ne

let arr = [{key: "alpha", value: "2"},{key:"beta", value:"3"},{key: "gamma", value: "4"}]; 
 
var obj = {}; 
 
arr.forEach(item => obj[item.key] = item); 
 
console.log(obj);

+2

Dans un tel cas, 'forEach' est mieux adapté que' map'. – Stephan

+1

ouais c'est correct, mis à jour ma réponse – Nemani

+0

Désolé, je viens de mettre à jour ma question. Chaque objet dans le tableau est complexe et nous avons seulement la garantie que 1 propriété "clé" est la même pour tous. – amp

0

Si vous souhaitez supprimer aussi la propriété key abondante, vous pouvez utiliser:

const array = [{key: "alpha", value: "2"}, {key: "beta", value: "3"}, {key: "gamma", value: "4", additional: "sample"}]; 
 
const obj = {}; 
 
array.forEach(item => {obj[item.key] = item; delete item['key'];}); 
 
console.log(obj); 
 
console.log(array);

A noter cependant que les entrées de tableau d'origine sont modifiés (les propriétés clés supprimeront). Si cela ne vise pas que vous avez à (? Profondeur) cloner les produits

const array = [{key: "alpha", value: "2"}, {key: "beta", value: "3"}, {key: "gamma", value: "4", additional: "sample"}]; 
 

 
const obj = {}; 
 
array.forEach(item => { 
 
    obj[item.key] = Object.assign({}, item); 
 
    delete obj[item.key]['key']; 
 
}); 
 
console.log(obj); 
 
console.log(array);

A noter cependant le support du navigateur pour Object.assign, si vous voulez soutenir par exemple IE, vous avez besoin d'un polyfill (peut-être aussi pour forEach et remplacer la fonction de flèche).

0

Merci à tous. Il semble que cela impliquera une sorte de boucle et supprimer l'opération, que j'éviter d'utiliser en raison de problèmes de performance: How do I remove a property from a JavaScript object?

tempObj = {}; 
for (let i = 0; i < arr.length; i++) { 
    tempObj[arr[i].key] = arr[i]; 
} 
//this will give this answer, close enough to what I want: 
//{ alpha: {key: "alpha", value: "2", property1: "some"}, beta: key:"beta", value:"3", property1: "extra", property2: "property", gamma: {key: "gamma", value: "4"} }