3 votes

Fusionner les données d'une carte dans un tableau en javascript

Voici à quoi ressemble mon Array actuel :

{ entity: 'A', type: 'request', requestUrl: 'val1' },
{ entity: 'A', type: 'response', responseUrl: 'val1' },
{ entity: 'B', type: 'request', requestUrl: 'val1' },
{ entity: 'B', type: 'response', responseUrl: 'val1' },
{ entity: 'C', type: 'request', requestUrl: 'val1' },
{ entity: 'C', type: 'response', responseUrl: 'val1' },
{ entity: 'D', type: 'request', requestUrl: 'val1' },
{ entity: 'D', type: 'response', responseUrl: 'val1' },
{ entity: 'DADA', type: '', responseUrl: 'val1' }

Chaque ligne contient un attribut nommé 'entity' qui a 2 lignes : l'une correspondant à la demande et l'autre à la réponse. J'ai besoin de fusionner les lignes de demande et de réponse, et d'avoir les données sur une seule ligne. (L'attribut 'type' n'a pas d'importance dans la ligne fusionnée, mais tous les autres attributs doivent être présents). La solution serait donc quelque chose comme :

[{"entity":"A","type":"response","requestUrl":"val1","responseUrl":"val1"},
{"entity":"B","type":"response","requestUrl":"val1","responseUrl":"val1"},
{"entity":"C","type":"response","requestUrl":"val1","responseUrl":"val1"},
{"entity":"D","type":"response","requestUrl":"val1","responseUrl":"val1"}]

Voici ce que j'ai actuellement : https://www.w3schools.com/code/tryit.asp?filename=FUHGQN2JON75

Je ne sais pas si c'est la meilleure façon de procéder. Les recommandations sur la manière d'améliorer cette solution sont les bienvenues.

Merci.

0voto

Prasanna Points 1484

En supposant que la requête et la réponse sont consécutives, nous pouvons simplement utiliser les opérateurs de diffusion pour fusionner.

const data = [{ entity: 'A', type: 'request', requestUrl: 'val1' },
{ entity: 'A', type: 'response', responseUrl: 'val1' },
{ entity: 'B', type: 'request', requestUrl: 'val1' },
{ entity: 'B', type: 'response', responseUrl: 'val1' },
{ entity: 'C', type: 'request', requestUrl: 'val1' },
{ entity: 'C', type: 'response', responseUrl: 'val1' },
{ entity: 'D', type: 'request', requestUrl: 'val1' },
{ entity: 'D', type: 'response', responseUrl: 'val1' },
{ entity: 'DADA', type: '', responseUrl: 'val1' }]

const newData = data.reduce((acc, item, index) => {
  if (index % 2 || !item.type) return acc;
  acc.push({...item, ...data[index+1]})
  return acc;
}, [])

console.log(newData)

0voto

brk Points 23303

Utiliser la réduction pour créer un nouveau tableau. Mais en même temps, la sortie doit être vérifiée si l'ordre des objets est modifié dans le tableau.

Considérons ces deux objets

{ entity: 'A', type: 'request', requestUrl: 'val1' },
{ entity: 'A', type: 'response', responseUrl: 'val1' }

Considérons le premier objet, et dans cet objet nous allons vérifier quelle clé est présente dans le second objet mais maintenant dans le premier objet, puis ajouter cette clé dans le premier objet.

let orgArray = [{
    entity: 'A',
    type: 'response',
    responseUrl: 'val1'
  },
  {
    entity: 'A',
    type: 'request',
    requestUrl: 'val1'
  },
  {
    entity: 'B',
    type: 'request',
    requestUrl: 'val1'
  },
  {
    entity: 'B',
    type: 'response',
    responseUrl: 'val1'
  },
  {
    entity: 'C',
    type: 'request',
    requestUrl: 'val1'
  },
  {
    entity: 'C',
    type: 'response',
    responseUrl: 'val1'
  },
  {
    entity: 'D',
    type: 'request',
    requestUrl: 'val1'
  },
  {
    entity: 'D',
    type: 'response',
    responseUrl: 'val1'
  },
  {
    entity: 'DADA',
    type: '',
    responseUrl: 'val1'
  }
]

let newArray = orgArray.reduce(function(acc, curr) {
  //get the index of the object where entity matches
  let getIndexOfEntity = acc.findIndex(function(item) {
    return item.entity === curr.entity
  })
  //if there is no such entity then it will give -1
  if (getIndexOfEntity === -1) {
    // in that case push the object
    acc.push(curr)
  } else {
    // if entity exist 
    //now check which key is missing from the
    // getting all the keys from both the object
    let getAllKeyFromAccObj = Object.keys(acc[getIndexOfEntity]);
    let getAllKeyFromCurrObj = Object.keys(curr)
    // looping through the key and adding the missing key 
    getAllKeyFromCurrObj.forEach(function(item) {
      if (getAllKeyFromAccObj.indexOf(item) === -1) {
        acc[getIndexOfEntity][item] = curr[item]
      }

    })
  }
  return acc;
}, [])

console.log(newArray)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X