433 votes

Comment convertir un objet {} en un tableau [] de paires clé-valeur en JavaScript

Je veux convertir un objet comme ceci:

 {"1":5,"2":7,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0}
 

dans un tableau de paires clé-valeur comme ceci:

 [[1,5],[2,7],[3,0],[4,0]...].
 

Comment convertir un objet en un tableau de paires clé-valeur en JavaScript?

654voto

Nenad Vracar Points 17412

Vous pouvez utiliser Object.keys() et map() pour ce faire

var obj = {"1":5,"2":7,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0}
var result = Object.keys(obj).map(function(key) {
  return [Number(key), obj[key]];
});

console.log(result);

289voto

Pila Points 1469

Le meilleur moyen est de faire:

 var obj ={"1":5,"2":7,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10"‌​:0,"11":0,"12":0} 
Object.entries(obj);
 

MODIFIER:

  1. Mettez à jour la réponse pour renvoyer [key, value] paires conformément à la question mise à jour.

80voto

Tiny Giant Points 13188

Object.entries() () retourne un tableau dont les éléments sont des tableaux correspondant à l'énumération des biens [key, value] des paires, qui se trouve directement sur object. L'ordre des propriétés est la même que celle donnée par boucle sur les valeurs des propriétés de l'objet manuellement.

- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/entries#Description

L' Object.entries fonction retourne près de la sortie exacte que vous demandez, sauf les clés sont des chaînes de caractères plutôt que des numéros.

const obj = {"1":5,"2":7,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0};

console.log(Object.entries(obj));

Si vous avez besoin de clés pour être des nombres, vous pourriez faire correspondre le résultat d'un nouveau tableau avec une fonction de rappel qui remplace la clé de chaque paire avec un certain nombre contrainte.

const obj = {"1":5,"2":7,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0};

const toNumericPairs = input => {
    const entries = Object.entries(input);
    return entries.map(entry => Object.assign(entry, { 0: +entry[0] }));
}

console.log(toNumericPairs(obj));

J'ai une flèche de la fonction et de l' Object.assign de la carte de rappel dans l'exemple ci-dessus afin que je puisse le garder dans l'enseignement en misant sur le fait qu' Object.assign retourne l'objet affecté, et une seule flèche d'instruction de la fonction de valeur de retour est le résultat de l'instruction.

Ceci est équivalent à:

entry => {
    entry[0] = +entry[0];
    return entry;
}

Comme mentionné par @TravisClarke dans les commentaires, la fonction map pourrait être réduit à:

entry => [ +entry[0], entry[1] ]

Cependant, créer un nouveau tableau pour chaque paire clé-valeur, au lieu de modifier le tableau existant en place, d'où le doublement de la quantité de paires clé-valeur des tableaux créés. Alors que les entrées de la matrice est toujours accessible, elle et ses entrées ne seront pas nettoyés.

Maintenant, même si à l'aide de notre méthode sur place utilise toujours les deux tableaux qui contiennent les paires clé-valeur (l'entrée et la sortie des tableaux), le nombre total de tableaux changements par un. L'entrée et la sortie des tableaux ne sont pas effectivement rempli avec les tableaux, mais plutôt des références à des tableaux et ces références de prendre une quantité négligeable de l'espace dans la mémoire.

  • La modification de chaque paire clé-valeur en place les résultats dans une quantité négligeable de la croissance de la mémoire, mais nécessite de taper un peu plus de caractères.
  • La création d'un nouveau tableau pour chaque paire clé-valeur des résultats dans le doublement de la quantité de mémoire requise, mais nécessite de taper un peu moins de personnages.

Vous pouvez aller plus loin et d'éliminer la croissance tout en modifiant les entrées de la matrice en place au lieu de la cartographie à un nouveau tableau:

const obj = {"1":5,"2":7,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0};

const toNumericPairs = input => {
  const entries = Object.entries(obj);
  for(let entry of entries) entry[0] = +entry[0];
  return entries;
}

console.log(toNumericPairs(obj));

23voto

bigh_29 Points 126

Encore une autre variante que vous pouvez utiliser si Object.values ne fonctionnera pas pour vous.

 var obj = {
  foo: 29,
  bar: 42
};
var arr = Array.from(Object.keys(obj), k=>obj[k]);
 

10voto

Pranav C Balan Points 10055

Utiliser Object.keys et Array#map méthodes.

var obj = {
  "1": 5,
  "2": 7,
  "3": 0,
  "4": 0,
  "5": 0,
  "6": 0,
  "7": 0,
  "8": 0,
  "9": 0,
  "10": 0,
  "11": 0,
  "12": 0
};
// get all object property names
var res = Object.keys(obj)
  // iterate over them and generate the array
  .map(function(k) {
    // generate the array element 
    return [+k, obj[k]];
  });

console.log(res);

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