2
votes

Remplissez les champs dans l'objet, à partir d'un autre objet

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


2 commentaires

qu'arrive-t-il à une propriété qui est dans template , mais pas dans data ?


Ah bonne question! Ça reste, laisse-moi changer le code pour refléter


8 Réponses :


5
votes

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)


0 commentaires

3
votes

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


0 commentaires

3
votes

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


0 commentaires

2
votes

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)


1 commentaires

Le proxy est nouveau pour moi! Merci pour l'option 'fun', je vais vérifier la documentation



0
votes

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


0 commentaires

0
votes

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


0 commentaires

0
votes

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)


0 commentaires

0
votes

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)


0 commentaires