En Javascript (ES6) ont deux objets avec des données.
const result = { a: 'test', b: 'test', x: '' }
C'est l'objet de données que je vais recevoir
const data = { a: 'test', b: 'test', c: 'test' }
Comment puis-je Je mappe les données de mon objet reçu à mon objet modèle sans autoriser les valeurs qui ne sont pas présentes dans l'objet modèle.
Le résultat devrait donc être le suivant.
XXX
8 Réponses :
vous pouvez utiliser un pour. ..en boucle:
const template = { a: '', b: '' } const data = { a: 'test', b: 'test', c: 'test' } const result = {}; for (let k in template) { result[k] = data[k]; } console.log(result)
Quelque chose comme ceci:
let result = {}; const template = { a: '', b: '' } const data = { a: 'test', b: 'test', c: 'test' } for (let prop in data) { if(prop in template) result[prop] = data[prop]; } console.log(result);
Vous pouvez obtenir l'objet template
et les propriétés avec les mêmes clés à partir de data
.
const template = { a: '', b: '', x: '' }, data = { a: 'test', b: 'test', c: 'test' }, result = Object.assign( {}, template, ...Object.keys(template).map(k => k in data && { [k]: data[k] }) ); console.log(result);
Pour le plaisir, vous pouvez utiliser un peu de magie Proxy :)
const template = { a: '', b: '' } const data = { a: 'test', b: 'test', c: 'test' } const result = { ...new Proxy(data, { ownKeys: () => Object.keys(template) }) } console.log(result)
Le proxy est nouveau pour moi! Merci pour l'option 'fun', je vais vérifier la documentation
Vous pouvez utiliser Array.reduce
pour regarder votre objet et ne changer que les clés qui vous intéressent. Cette méthode gérera également le cas où la clé que vous souhaitez copier depuis les données
ne sont pas ici. Nous avons également créé un nouvel objet, nous ne mutons pas l'existant.
Sans mutation (nouvel objet)
const template = { a: '', b: '', }; const data = { a: 'test', b: 'test', c: 'test', }; Object.keys(template).forEach((x) => { template[x] = data[x] !== void 0 ? data[x] : template[x]; }); console.log(template);
Mutation de l'objet (utiliser l'ancien objet)
const template = { a: '', b: '', }; const data = { a: 'test', b: 'test', c: 'test', }; const ret = Object.keys(template).reduce((tmp, x) => { tmp[x] = data[x] !== void 0 ? data[x] : tmp[x]; return tmp; }, { ...template, }); console.log(ret);
const template = { a: '', b: '' } const data = { a: 'test', b: 'test', c: 'test' } function setData(inputTemplate, inputData) { outputObject = {} for (var key in inputTemplate) { if (inputData[key]) { outputObject[key] = inputData[key]; } } return outputObject } console.log(setData(template, data))
Vous pouvez simplement faire une boucle sur les clés de votre modèle et définir la valeur avec l'objet de données avec la même clé.
const data = { a: 'test', b: 'test', c: 'test' } const template = { a: '', b: '' } Object.keys(template).forEach((key) => template[key] = data[key]) console.log(template)
vous pouvez également utiliser réduire
Exemple:
const template = { a: '', b: '' } const data = { a: 'test', b: 'test', c: 'test' } const res = Object.keys(template).reduce((all, acc) => { all[acc] = data[acc] return all }, {}) console.log(res)
qu'arrive-t-il à une propriété qui est dans
template
, mais pas dansdata
?Ah bonne question! Ça reste, laisse-moi changer le code pour refléter