2017-10-19 7 views
0

J'ai un objetRetour un nouvel objet avec des propriétés supplémentaires en JavaScript

usersById: { 
    1: { name: 'John' }, 
    2: { name: 'Michelle' }, 
    ... 
} 

Je veux retourner le même objet, mais d'abord remplir l'objet à id = 2 avec une nouvelle propriété age, mais coller à immutabilité.

Je pense que ce serait quelque chose comme

return { 
    ...usersById, 
    ...usersById[2].age = 40 
} 

mais je reçois une erreur In this environment the sources for assign MUST be an object. This error is a performance optimization and not spec compliant.

Sinon, je pense que ce devrait être quelque chose comme

return Object.keys(usersById).map(userId => { 
    if (userId === 2) { 
    return { 
     ...usersById[2], 
     ...age = 40 
    } 
    } 
    return usersById[userId] 
}) 

mais il retourne un tableau et non un objet.

+1

Carte renvoie toujours un tableau, car c'est une méthode de tableau. – evolutionxbox

+0

Je sais, mais n'est pas 'réduire' aussi une méthode tableau qui pourrait retourner un objet avec' arr.reduce ((accumulator, item) => {...}, {}) '? – Jamgreen

+0

Ce n'est pas une tautologie. Les méthodes de tableau ne retournent pas toujours un tableau. Je n'aurais pas dû m'en servir comme explication. – evolutionxbox

Répondre

3

Vous avez la bonne idée mais la mauvaise syntaxe. Essayez ceci:

return { 
    ...usersById, 
    2: { 
    ...usersById[2], 
    age: 40 
    } 
} 

Ou si la clé est dynamique, vous pouvez le faire:

let key = 2; 
return { 
    ...usersById, 
    [key]: { 
    ...usersById[key], 
    age: 40 
    } 
} 
+0

Ça marche! Merci: D – Jamgreen

+1

@Jamgreen Glad je pourrais aider :) –

+0

Je suis désolé de rester ici, mais pourquoi ne pas essayer usersById [2] .age = 40; retourne usersById; ? La solution dans cette réponse renvoie le tableau avec l'objet original comme premier élément et le sous-objet mis à jour comme deuxième élément. Je suis désolé, mais je ne comprends pas quelque chose ici et apprécierais si vous l'expliquez plus largement ... Merci! – GSazheniuk

0

Vous pouvez faire votre propre fonction pour retourner un même objet avec des valeurs peuplées

Exemple simple:

var usersById = { 
 
    1: { name: 'John' }, 
 
    2: { name: 'Michelle' }, 
 
} 
 

 
usersById = oneLevelDeepAssign(usersById,2,{age:21}) 
 

 

 
function oneLevelDeepAssign(object, key, objectToAssign){ 
 

 
    return Object.assign({},object,{[key]:Object.assign({},object[key],objectToAssign)}) 
 

 
} 
 

 
console.log(usersById);