2
votes

JavaScript mettre à jour la valeur de l'objet à partir d'un autre objet

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'
      },
   ]
}


1 commentaires

Avez-vous un extrait de code où vous avez essayé de le réaliser?


3 Réponses :


1
votes

Vous pouvez utiliser forEach et Object.entries

Voici l'idée est

  • Première boucle sur chaque élément du tableau myObject de currentObject
  • Maintenant, comme dans votre structure, vous avez la valeur de currentObject comme clé dans updateObject , donc nous vérifions l'existence par updateObject.myObject [valeur]
  • Si c'est leur, nous mettons à jour 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)


2 commentaires

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



1
votes

Nous pouvons utiliser Array.reduce et rechercher la propriété attribute3 de l'élément courant ( ele ) dans le updateObject.myObject .

S'il est présent, mettez-le à jour avec la valeur correspondante de 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));


2 commentaires

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.



1
votes

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é.


0 commentaires