1
votes

javascript ne peut pas mapper un tableau d'objets avec des valeurs imbriquées

Essayer de mapper un tableau d'objets avec des valeurs imbriquées dans la structure des objets enfants comme:

const mapped = objs.map((key, index) => {
  Object.keys(key).map(el => ({
    name: el
  }))
})

à la structure comme:

[
  { name: 'B', value: 1 }, 
  { name: 'D', value: '45' }, 
  { name: 'E', value: '234' }, 
  { name: 'A', value: '543' },
  { name: 'C', value: '250' }
]

et le résultat du mappage est non défini

const objs = [{
        "B": {
            "value": 1,
        },
        "D": {
            "value": "45"
        },
        "E": {
            "value": "234"
        },
        "A": {
            "value": "543"
        },
        "C": {
            "value": "250"
        }
    },...]

Exemple: Stackblitz


1 commentaires

return est manquant.


3 Réponses :


3
votes

return est manquant dans Object.keys . De plus, au lieu de Object.keys , utilisez Object.entries pour obtenir key et value .

p>

const objs = [{
  "B": {
    "value": 1,
  },
  "D": {
    "value": "45"
  },
  "E": {
    "value": "234"
  },
  "A": {
    "value": "543"
  },
  "C": {
    "value": "250"
  }
}];
const mapped = objs.map((key, _) => {
  return Object.entries((key)).map(([name, {
    value
  }]) => ({
    name,
    value
  }))
}).flat();

console.log(mapped);


0 commentaires

3
votes

Il vous manque l'instruction return et la définition de la propriété value .

En outre, vous pouvez utiliser flatMap au lieu de map afin d'éviter un tableau imbriqué dans le résultat:

const objs = [{
    "B": {
        "value": 1,
    },
    "D": {
        "value": "45"
    },
    "E": {
        "value": "234"
    },
    "A": {
        "value": "543"
    },
    "C": {
        "value": "250"
    }
}]

const mapped = objs.flatMap((key, index) => {
    return Object.keys(key).map(el => ({
        name: el,
        value: key[el].value
    }))
})

console.log(mapped)


2 commentaires

Excellent exemple. Existe-t-il un moyen de garder l'ordre des éléments tout au long de l'itération comme dans l'exemple?


Merci! L'ordre des objets en résultat est-il différent de l'ordre des clés? De mon côté, cela semble être le même (B, D, E, A, C).



5
votes

Vous devez opérer sur objs [0], pas sur objs, car il s'agit d'un tableau d'un objet, pas d'un tableau d'objets.

let array = []
for(let object in objs[0]){
array.push({
"name": object,
"value": objs[0][object].value
})
}


1 commentaires

Mon erreur, je n'ai pas ajouté la structure de données entière (juste trois points), il y a un tableau d'objets comme dans l'exemple sur le stackblitz.