4 votes

Comment obtenir un tableau des valeurs de toutes les propriétés des objets à l'intérieur d'un tableau d'objets ?

Je veux obtenir un tableau des valeurs de chaque objet que je possède.

J'ai ça :

const numDataPoints = [
    {
      x0: {x: 807, y: 625},
      x1: {x: 15, y: 20},
      x2: {x: 5, y: 20}
    },
    {
      x0: {x: 11, y: 6},
      x1: {x: 16, y: 21},
      x2: {x: 7, y: 22}
    }
  ];

Je veux ça :

[
  [807, 625],
  [15, 20],
  [5, 20],
  [11, 6],
  [16, 21],
  [7, 22]
]

J'ai essayé ça :

numDataPoints.map((array) => array.map(axis => [axis.x, axis.y]));

mais cette erreur s'est produite :

Uncaught TypeError : array.map n'est pas une fonction

7voto

Nenad Vracar Points 17412

Vous pouvez utiliser map avec Object.values et répandre la syntaxe ... .

const data =  [{ x0: {x: 807, y: 625}, x1: {x: 15, y: 20}, x2: {x: 5, y: 20} }, { x0: {x: 11, y: 6}, x1: {x: 16, y: 21}, x2: {x:7, y: 22} }];

const result = [].concat(...data.map(Object.values)).map(Object.values)
console.log(result)

5voto

mickl Points 8755

Vous pouvez utiliser Array.map pour transformer chaque objet en un tableau de tableaux à deux éléments, puis réduire pour aplatir le résultat :

const numDataPoints =  [{ x0: {x: 807, y: 625}, x1: {x: 15, y: 20},
            x2: {x: 5, y: 20} }, { x0: {x: 11, y: 6}, x1: {x: 16, y: 21}, x2: {x:7, y: 22} }];

let result = numDataPoints.map(
    item => Object.values(item).map(({x, y})=> [x, y]))
              .reduce((arr, current) => [...arr, ...current], []);

  console.log(result);

4voto

mmm Points 17173

Utilisez reduce pour cela - ce qui suit fonctionnera aussi pour d'autres données puisque nous ne codons pas en dur les noms des clés ici.

const res = numDataPoints.reduce((a, b) => a.concat(Object.keys(b).map(e => Object.values(b[e]))), []);
console.log(res);

<script>
const numDataPoints = [
    {
        x0: {
            x: 807,
            y: 625
        },
        x1: {
            x: 15,
            y: 20
        },
        x2: {
            x: 5,
            y: 20
        }
    }, {
        x0: {
            x: 11,
            y: 6
        },
        x1: {
            x: 16,
            y: 21
        },
        x2: {
            x: 7,
            y: 22
        }
    }
];
</script>

1voto

Xufox Points 3719

Vous n'avez pas de tableaux dans votre numDataPoints mais des objets ordinaires, de sorte que vous ne pouvez pas utiliser map .

Ce dont vous avez besoin, c'est Object.values . Ou bien, pour garantissent le même ordre des clés x0 , x1 y x2 , déstructurer con {x0, x1, x2} et ensuite utiliser [x0, x1, x2] .

La structure de numDataPoints suggère, que vous voulez en fait un tableau de deux tableaux, chacun avec trois [x, y] points, au lieu de six seulement [x, y] points. Si vous voulez toujours aplatir ces sous-réseaux, utilisez concat o flatMap (actuellement candidat à l'étape 3, susceptible de faire partie de l'édition ECMAScript finalisée en juin 2019).

Voici les six possibilités :

const numDataPoints = [
    {
      x0: {x: 807, y: 625},
      x1: {x: 15, y: 20},
      x2: {x: 5, y: 20}
    },
    {
      x0: {x: 11, y: 6},
      x1: {x: 16, y: 21},
      x2: {x: 7, y: 22}
    }
  ];

// Object.values, same structure
console.log(numDataPoints.map((obj) => Object.values(obj).map(({x, y}) => [x, y])));

// Object.values, flattened with concat
console.log([].concat(...numDataPoints.map((obj) => Object.values(obj).map(({x, y}) => [x, y]))));

// Object.values, flattened with flatMap
console.log(numDataPoints.flatMap((obj) => Object.values(obj).map(({x, y}) => [x, y])));

// Destructuring, same structure
console.log(numDataPoints.map(({x0, x1, x2}) => [x0, x1, x2].map(({x, y}) => [x, y])));

// Destructuring, flattened with concat
console.log([].concat(...numDataPoints.map(({x0, x1, x2}) => [x0, x1, x2].map(({x, y}) => [x, y]))));

// Destructuring, flattened with flatMap
console.log(numDataPoints.flatMap(({x0, x1, x2}) => [x0, x1, x2].map(({x, y}) => [x, y])));

0voto

user184994 Points 12319

Vous pouvez utiliser Object.keys pour itérer sur les clés dans l'objet, comme ceci :

let data = [{
  x0: {
    x: 807,
    y: 625
  },
  x1: {
    x: 15,
    y: 20
  },
  x2: {
    x: 5,
    y: 20
  }
}, {
  x0: {
    x: 11,
    y: 6
  },
  x1: {
    x: 16,
    y: 21
  },
  x2: {
    x: 7,
    y: 22
  }
}];

let result = data.map(obj => Object.keys(obj).map((key) => [obj[key].x, obj[key].y]));

console.log(result);

Vous voudrez peut-être aplatir le résultat, je ne suis pas sûr.

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