631 votes

Convertir un tableau en objet

Quelle est la meilleure façon de convertir :

['a','b','c']

à :

{
  0: 'a',
  1: 'b',
  2: 'c'
}

3 votes

Peut-être que ce dont il a besoin, c'est d'un code pour taper les canards. pas de penser qu'il s'agit d'une instance de Array

7 votes

Il faut savoir que les tableaux Javascript sont objets.

0 votes

Si quelqu'un d'autre est à la recherche d'une solution Lodash, pensez à _.keyBy (anciennement _.indexBy ) : lodash.com/docs#keyBy

532voto

Pointy Points 172438

Avec une fonction comme celle-ci :

function toObject(arr) {
  var rv = {};
  for (var i = 0; i < arr.length; ++i)
    rv[i] = arr[i];
  return rv;
}

Votre tableau est déjà plus ou moins un objet, mais les tableaux ont un comportement "intéressant" et spécial en ce qui concerne les propriétés nommées par des entiers. L'exemple ci-dessus vous donnera un objet ordinaire.

modifier oh, il faut aussi tenir compte des "trous" dans le réseau :

function toObject(arr) {
  var rv = {};
  for (var i = 0; i < arr.length; ++i)
    if (arr[i] !== undefined) rv[i] = arr[i];
  return rv;
}

Dans les moteurs d'exécution JavaScript modernes, vous pouvez utiliser la fonction .reduce() méthode :

var obj = arr.reduce(function(acc, cur, i) {
  acc[i] = cur;
  return acc;
}, {});

Cette méthode permet également d'éviter les "trous" dans le tableau, car c'est ainsi que .reduce() travaux.

0 votes

Je pense que c'est génial, j'ai juste ajouté quelques trucs pour mon plaisir retourne un objet qu'on ne peut pas référencer en dehors de la fonction donc j'ai juste montré un exemple de ça et ajouté quelque chose aux noms des propriétés de l'objet x = ['a','b','c'] var b = {} function toObject(arr) { var rv = {}; for (var i = 0; i < arr.length; ++i) if (arr[i] !== undefined) { rv['key_' + i] = arr[i]; } b = rv return b; } toObject(x) b.key_0

0 votes

Qu'en est-il var arr = []; arr['foo'] = "bar" ? Peut-on le convertir en objet ?

2 votes

@m93a c'est déjà un objet. En JavaScript, il est vraiment inutile de créer une instance de Array ( [] ) si vous n'avez pas l'intention d'utiliser des clés de propriété numériques et la propriété "longueur".

327voto

roland Points 1433

Vous pourriez utiliser un accumulateur alias reduce .

['a','b','c'].reduce(function(result, item, index, array) {
  result[index] = item; //a, b, c
  return result;
}, {}) //watch out the empty {}, which is passed as "result"

Passer un objet vide {} comme point de départ ; puis "augmenter" cet objet de manière incrémentielle. A la fin des itérations, result sera {"0": "a", "1": "b", "2": "c"}

Si votre tableau est un ensemble d'objets de type paire clé-valeur :

[{ a: 1},{ b: 2},{ c: 3}].reduce(function(result, item) {
  var key = Object.keys(item)[0]; //first property: a, b, c
  result[key] = item[key];
  return result;
}, {});

produira : {a: 1, b: 2, c: 3}

Dans un souci d'exhaustivité, reduceRight vous permet d'itérer sur votre tableau dans l'ordre inverse :

[{ a: 1},{ b: 2},{ c: 3}].reduceRight(/* same implementation as above */)

produira : {c:3, b:2, a:1}

Votre accumulateur peut être de n'importe quel type pour votre usage spécifique. Par exemple, pour échanger la clé et la valeur de votre objet dans un tableau, passez la commande [] :

[{ a: 1},{ b: 2},{ c: 3}].reduce(function(result, item, index) {
  var key = Object.keys(item)[0]; //first property: a, b, c
  var value = item[key];
  var obj = {};
  obj[value] = key;
  result.push(obj);
  return result;
}, []); //an empty array

produira : [{1: "a"}, {2: "b"}, {3: "c"}]

Contrairement à map , reduce ne peut pas être utilisé comme un mapping 1-1. Vous avez un contrôle total sur les éléments que vous souhaitez inclure ou exclure. Par conséquent, reduce vous permet de réaliser ce que filter fait, ce qui rend reduce très polyvalent :

[{ a: 1},{ b: 2},{ c: 3}].reduce(function(result, item, index) {
  if(index !== 0) { //skip the first item
    result.push(item);
  }
  return result;
}, []); //an empty array

produira : [{2: "b"}, {3: "c"}]

Attention : reduce et Object.key font partie de ECMA 5th edition ; vous devriez fournir un polyfill pour les navigateurs qui ne les prennent pas en charge (notamment IE8).

Voir une implémentation par défaut par Mozilla .

2 votes

Utile pour maintenir un magasin redux lorsque vous utilisez une carte d'objets et que vous devez supprimer l'une des clés.

104voto

Max Points 2659

Si vous utilisez Jquery :

$.extend({}, ['a', 'b', 'c']);

4 votes

Bizarre, si je donne une variable Array, elle met chaque caractère dans un objet séparé : 0 : "a", 1 : ",", 2 : "b"... Donc elle ignore les guillemets, mais inclut les virgules...

0 votes

@Max Je pense qu'il n'y a pas un tel comportement. L'objet retourné est {0: 'a', 1: 'b', 2: 'c'} ce qui est un résultat attendu.

3 votes

Existe-t-il un moyen d'utiliser $.extend tout en informant les clés d'une manière non numérique, c'est-à-dire en effectuant des calculs sur les éléments du tableau ?

48voto

Dave Dopson Points 16690

Je l'écrirais probablement de cette façon (car il est très rare que je n'aie pas la bibliothèque underscorejs à portée de main) :

var _ = require('underscore');

var a = [ 'a', 'b', 'c' ];
var obj = _.extend({}, a);
console.log(obj);
// prints { '0': 'a', '1': 'b', '2': 'c' }

9 votes

Vous downvotez ma réponse, mais pas de commentaire ? Ma réponse est correcte et testée. Quelle est l'objection ?

14 votes

Cette question n'a pas de balise underscore, et vous supposez également node.js ou une bibliothèque require.

10 votes

L'underscore est assez courant sur le client et le serveur. Elle est supposée pour Backbone.js et est probablement LA bibliothèque utilitaire la plus commune. Ceci étant dit, j'ai inclus la ligne require pour qu'il soit clair que j'utilise une bibliothèque. Il n'y a pas de ligne unique pour décrire "ajouter underscore.js à votre page", donc une traduction est nécessaire pour un environnement de navigateur.

6voto

lordkrandel Points 30

Rapide et sale #2 :

var i = 0
  , s = {}
  , a = ['A', 'B', 'C'];

while( i < a.length ) { s[i] = a[i++] };

0 votes

Pourquoi utilisez-vous la notation par virgule ?

3 votes

Je préfère que la virgule soit placée sur la ligne suivante. Je trouve cette notation plus facile à lire.

2 votes

La boucle s'arrêtera si le tableau contient une valeur erronée. Vous devez vérifier i < a.length au lieu de a[i] .

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