2017-10-16 4 views
4

Je voudrais tourner ceci:Comment transformer un tableau à un objet

let myArray = [ {city: "NY"}, {status: 'full'} ]; 

à ceci:

let myObj = { city: "NY", status: 'full' }; 

alors que j'essayé ceci:

let newObj = {}; 
for (var i = 0; i < myArray.length; i++) { 
    (function(x) { 
    newObj = Object.assign(myArray[i]); 
    })(i); 
} 

il attribue la dernière paire à l'objet

+1

Votre objet est invalide; vous ne pouvez pas avoir '{{{city: 'NY'}}' –

Répondre

11

Spread du tableau dans Object#assign:

const myArray = [ {city: "NY"}, {status: 'full'} ]; 
 

 
const myObj = Object.assign({}, ...myArray); 
 

 
console.log(myObj);

Remarque: Assignez dans un objet vide. Si vous omettez l'objet vide, le 1er élément du tableau original sera muté (tout sera fusionné).

+0

Yup, C'est ce que je voulais dire. C'était une erreur –

+2

de noter que l'opérateur de propagation n'est pas disponible dans IE 11 – zfrisch

+1

cela n'a aucun sens d'avoir un travail autour de la syntaxe de propagation et d'utiliser 'Object.assign', qui n'est pas disponible sur IE11. –

2

Je suis d'accord avec Ori que votre question semble être sur la création d'un objet indexé qui est généralement pas un bon plan, mais si son nécessaire de taper votre objet avec des chiffres vous pouvez le faire comme ceci:

let newObj = {}; 
myArray.forEach((val, index) => { newObj[index] = val }); 
+0

Yup, C'est ce que je voulais dire. C'était une erreur –

1
let myArray = [ {city: "NY"}, {status: 'full'} ]; 

let newObj = myArray.reduce((acc, curr) => { 
    Object.keys(curr).forEach(val => { 
    acc[val] = curr[val] 
    }) 
    return acc 
}, {}) 

console.log(newObj) 

Cette syntaxe est prise en charge dans IE selon caniuse.com

+0

Une goutte de code sans aucun contexte n'est pas la meilleure réponse. S'il vous plaît envisager d'étendre sur cela. On ne sait pas non plus, même du contexte de la question, ce que signifie "IE Supported". – jdv

+0

'map' sans utiliser le résultat est un mauvais modèle pour juste itérer le tableau. vous pouvez utiliser 'forEach'. –

2

vous pouvez également utiliser Array.reduce() qui vous donnera plus de contrôle précis grain:

const myArray = [ 
 
    { city: "NY", color: 'blue', rodents: { small: false, medium: false, large: true } }, 
 
    { status: 'full', color: 'red' }, 
 
    { sandwich: 'flavourful' } 
 
] 
 
    
 
// item is each object in your array 
 
const reduced = myArray.reduce((newObj, item) => { 
 
    // existing props will be overwritten by newer object entries in the array 
 
    // this example is same as Object.assign spread with right to left precedence, 
 
    // until you want more custom logic 
 
    Object.keys(item).forEach((key) => newObj[key] = item[key]) 
 
    return newObj 
 
}, {}) 
 
    
 
console.log(reduced)