J'ai deux objets, l'un est utilisé pour mettre à jour l'autre, quelque chose comme Processus ETL.
const currentObject = { myObject : [ { 'attribute1':'foo1', 'attribute2':'bar1', 'attribute3':'newtest1' }, { 'attribute1':'foo2', 'attribute2':'bar2', 'attribute3':'newtest2' }, { 'attribute1':'foo3', 'attribute2':'bar3', 'attribute3':'newtest3' } ] }
si la valeur de l'attribut3 est "test1", alors allez à l'autre objet et vérifiez la propriété test1 et remplacez le currentObject par la nouvelle valeur
const updateObject = { myObject : { 'test1':'newtest1', 'test2':'newtest2', 'test3':'newtest3' } }
la mise à jour est effectuée sur l'attribut currentObject3 doit utiliser la propriété updateObject comme référence; où l'attribut currentObject1 = "test1" doit copier les données de updateObject test1, ainsi de suite:
La valeur finale doit être comme:
const currentObject = { myObject : [ { 'attribute1':'foo1', 'attribute2':'bar1', 'attribute3':'test1' }, { 'attribute1':'foo2', 'attribute2':'bar2', 'attribute3':'test2' }, { 'attribute1':'foo3', 'attribute2':'bar3', 'attribute3':'test3' }, ] }
3 Réponses :
Vous pouvez utiliser forEach
et Object.entries
Voici l'idée est
myObject
de currentObject
currentObject
comme clé
dans updateObject
, donc nous vérifions l'existence par updateObject.myObject [valeur]
currentObject
sinon nous le gardons inchangé
const currentObject = {myObject : [{'attribute1':'foo1','attribute2':'bar1','attribute3':'test1'},{'attribute1':'foo2','attribute2':'bar2','attribute3':'test2'},{'attribute1':'foo3','attribute2':'bar3','attribute3':'test3'},]} const updateObject = {myObject : {'test1':'newtest1','test2':'newtest2','test3':'newtest3'}} currentObject.myObject.forEach(e => { Object.entries(e).forEach(([key,value]) => { if(updateObject.myObject[value]){ e[key] = updateObject.myObject[value] } }) }) console.log(currentObject)
Il m'a fallu un certain temps pour bien comprendre la logique et me retrouver avec un doute, que se passerait-il si je voulais changer la "e [clé]" pour mettre à jour la valeur d'un autre attribut dans le currentObject, cela ne peut être fait qu'en mettant à jour cette ligne de code ? e [key] = updateObject.myObject [value], merci pour le code c'est une bonne logique pour améliorer mes compétences.
@bernlt oui, vous devez modifier cette ligne en conséquence si vous voulez réaliser autre chose que ce que vous avez spécifié dans la question
Nous pouvons utiliser S'il est présent, mettez-le à jour avec la valeur correspondante de Array.reduce
et rechercher la propriété attribute3
de l'élément courant ( ele
) dans le updateObject.myObject .
updateObject.myObject
sinon gardez l'ancien: const currentObject = {myObject : [{'attribute1':'foo1','attribute2':'bar1','attribute3':'test1'},{'attribute1':'foo2','attribute2':'bar2','attribute3':'test2'},{'attribute1':'foo3','attribute2':'bar3','attribute3':'test3'},]};
const updateObject = {myObject : {'test1':'newtest1','test2':'newtest2','test3':'newtest3'}};
function transformObject(currentObject, updateObject){
const out = currentObject.myObject.reduce((acc, ele) => {
ele.attribute3 = updateObject.myObject[ele.attribute3] ?
updateObject.myObject[ele.attribute3] :
ele.attribute3;
return acc.concat(ele);
}, []);
finalObj = {[Object.keys(currentObject)[0]] : out };
return finalObj;
}
console.log(transformObject(currentObject, updateObject));
Hé c'est génial, pouvez-vous m'aider à comprendre cette ligne de code: finalObj = {[Object.keys (currentObject) [0]]: out};
@bernlt qui ajoute en fait la clé myObject
dans la sortie finalObj
. donc Object.keys
renverra le tableau de clés dans currentObject
qui sera [myObject]
mais je veux la valeur de la chaîne donc je dois prenez le '0' index du tableau.
Cela se transforme en une seule ligne avec les dernières fonctionnalités du langage JavaScript:
const currentObject = { myObject: [ { 'attribute1': 'foo1', 'attribute2': 'bar1', 'attribute3': 'test1' }, { 'attribute1': 'foo2', 'attribute2': 'bar2', 'attribute3': 'test2' }, { 'attribute1': 'foo3', 'attribute2': 'bar3', 'attribute3': 'test3' }, ] } const updateObject = { myObject: { 'test1': 'newtest1', 'test2': 'newtest2', 'test3': 'newtest3' } } const result = { myObject: currentObject.myObject.map(o => ({ ...o, ...{ 'attribute3': updateObject.myObject[o.attribute3] } })) }; console.log(result);
... et vous obtenez également l'immuabilité.
Avez-vous un extrait de code où vous avez essayé de le réaliser?