Convertir un tableau en objet

515

Quelle est la meilleure façon de convertir:

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

à:

{
  0: 'a',
  1: 'b',
  2: 'c'
}
David Hellsing
la source
3
Peut-être qu'il a besoin d'un code de type canard pour ne pas penser qu'il s'agit d'une instance de tableau
Pointy
6
Il convient de souligner que les tableaux Javascript sont des objets.
Spudley
Si quelqu'un d'autre recherche une solution Lodash, pensez _.keyBy(anciennement _.indexBy): lodash.com/docs#keyBy
2540625
C'est un peu déroutant parce que les tableaux sont déjà des objets, mais je suppose que le point de la question est de convertir l' objet exotique du tableau en un objet ordinaire .
Oriol
1
Un moyen simple de le faire avec Lodash est _.toPlainObject. Ex:var myObj = _.toPlainObject(myArr)
Julian Soro

Réponses:

473

ECMAScript 6 présente le polyfillable facilement Object.assign:

La Object.assign()méthode est utilisée pour copier les valeurs de toutes les propriétés propres énumérables d'un ou plusieurs objets source vers un objet cible. Il renverra l'objet cible.

Object.assign({}, ['a','b','c']); // {0:"a", 1:"b", 2:"c"}

La propre lengthpropriété du tableau n'est pas copiée car elle n'est pas énumérable.

En outre, vous pouvez utiliser la syntaxe de diffusion ES6 pour obtenir le même résultat:

{ ...['a', 'b', 'c'] }
Oriol
la source
Je veux juste souligner - si vous avez déjà un tableau de propriétés triées à partir de l'objet d'origine, l'utilisation de l' opérateur de propagation est ce qui transformera ce tableau directement en un nouvel objet:{ ...[sortedArray]}
HappyHands31
Oriol, existe-t-il un moyen de définir une clé fixe au lieu de 0 et 1?
Menai Ala Eddine
488

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 juste un objet, mais les tableaux ont un comportement "intéressant" et spécial en ce qui concerne les propriétés nommées entières. Ce qui précède vous donnera un objet simple.

modifier oh aussi vous voudrez peut-être tenir compte des "trous" dans le tableau:

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 runtimes JavaScript modernes, vous pouvez utiliser la .reduce()méthode:

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

Celui-ci évite également les "trous" dans le tableau, car c'est ainsi que cela .reduce()fonctionne.

Pointu
la source
2
@ m93a c'est déjà un objet. En JavaScript, il est vraiment inutile de créer une instance Array ( []) si vous n'utilisez pas les clés de propriété numériques et la propriété "length".
Pointy
15
façon plus propre d'éviter la réaffectation des const obj = arr.reduce((obj, cur, i) => { return { ...obj, [i]: cur }; }, {});
paramètres
3
Flèche + syntaxe destructurante sans retour explicite:const obj = arr.reduce((obj, cur, i) => ({ ...obj, [i]: cur }), {});
Marc Scheib
2
@eugene_sunic en effet, mais cette approche n'était pas disponible quand j'ai répondu à cela en 2010 :)
Pointy
2
Comme le souligne @miro, la création d'un nouvel objet à chaque fois n'est pas nécessaire, et en fait beaucoup plus lente que la manipulation de l'objet initial qui a été créé. L'exécution d'un test JSPerf sur un tableau de 1 000 éléments, la création d'un nouvel objet à chaque fois est 1 000 fois plus lente que la mutation de l'objet existant. jsperf.com/…
romellem
281

Vous pouvez utiliser un accumulateur aka 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"

Passez un objet vide {}comme point de départ; puis "augmentez" cet objet progressivement. A la fin des itérations, resultsera{"0": "a", "1": "b", "2": "c"}

Si votre tableau est un ensemble d'objets de 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}

Par souci d'exhaustivité, reduceRightvous 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 à des fins spécifiques. Par exemple, afin d'échanger la clé et la valeur de votre objet dans un tableau, passez []:

[{ 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, reducene peut pas être utilisé comme mappage 1-1. Vous avez un contrôle total sur les éléments que vous souhaitez inclure ou exclure. reduceVous permet donc de réaliser ce qui filterfait, ce qui le rend reducetrè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 : reduceet Object.keyfont partie de ECMA 5th edition; vous devez fournir un polyfill pour les navigateurs qui ne les prennent pas en charge (notamment IE8).

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

Roland
la source
1
Utile pour maintenir un magasin redux lorsque vous utilisez une carte d'objets et que vous devez déposer l'une des clés
dhruvpatel
101

Si vous utilisez jquery:

$.extend({}, ['a', 'b', 'c']);
Max
la source
4
Bizarre, si je donne une variable Array, elle met chaque caractère dans un objet séparé: 0: "a", 1: ",", 2: "b" ... Donc, il ignore les guillemets, mais inclut les virgules .. .
TrySpace
@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.
ivkremer
3
Existe-t-il un moyen d'utiliser $ .extend tout en informant les clés de manière non numérique, c'est-à-dire en faisant des calculs sur les éléments du tableau?
Davi Lima
test super génial et court
Faisal Mehmood Awan
63

Pour être complet, ECMAScript 2015 (ES6) se propage. Nécessite un transpilateur (Babel) ou un environnement exécutant au moins ES6.

console.log(
   { ...['a', 'b', 'c'] }
)

mcmhav
la source
2
En fait, ce n'est pas non plus nativement disponible dans ES2015. Il est cependant très élégant.
Aluan Haddad
47

Je l'écrirais probablement de cette façon (car très rarement je n'aurai 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' }
Dave Dopson
la source
9
vous downvote ma réponse, mais pas de commentaire? Ma réponse est correcte et testée. Quelle est l'objection?
Dave Dopson
14
Cette question n'a pas de balise de soulignement et vous supposez également node.js ou une bibliothèque requise.
David Hellsing
10
le soulignement est assez courant à la fois sur le client et sur le serveur. Il est supposé pour Backbone.js et est probablement LA bibliothèque d'utilitaires la plus courante. Cela étant dit, j'ai inclus la ligne require pour indiquer clairement que j'utilisais une bibliothèque. Il n'y a pas de 1-liner pour décrire "ajouter underscore.js à votre page", donc une traduction est requise pour un environnement de navigateur
Dave Dopson
6
Pourtant, si vous utilisez undserscore, un simple obj=_.extend({},a);ferait l'affaire. De plus, si vous parcourez des tableaux, je dirais que ce _.eachserait plus approprié que _.map. Dans l'ensemble, ce n'est pas une bonne réponse à plusieurs niveaux.
David Hellsing
4
Les gens "vous devez répondre sans mentionner de soulignement ou de tiret bas" sont tellement ennuyeux. Comparable à dire que vous devez répondre aux questions C ++ sans mentionner les bibliothèques standard. Si le soulignement ou le tiret bas n'est pas une option, l'OP devrait le mentionner.
Charlie Martin
26

Voici une méthode O (1) ES2015 juste pour être complète.

var arr = [1, 2, 3, 4, 5]; // array, already an object
Object.setPrototypeOf(arr, Object.prototype); // now no longer an array, still an object
Benjamin Gruenbaum
la source
(1) Selon MDN , changer le [[Prototype]] d'un objet est une opération très lente. (2) Cela ne supprime pas la lengthpropriété propre . (3) l'objet est toujours un tableau, Array.isArray(arr) === true. (4) Les comportements de tableaux spéciaux ne sont pas supprimés, par exemple, arr.length = 0supprime tous les indices. (5) Par conséquent, je pense que Object.assignc'est beaucoup mieux .
Oriol
1
@Oriol mdn a tort, au moins dans V8 (mais aussi dans d'autres moteurs), c'est une opération assez rapide dans ce cas particulier - puisque les objets ont une mémoire numérique de toute façon, cela change fondamentalement deux pointeurs.
Benjamin Gruenbaum
Cela peut également être utilisé pour le fait qu'il est apparemment unique parmi les autres solutions rapides, de préserver toutes les propriétés non indexées ("propres") sur le tableau (c'est-à-dire, les propriétés entières non positives) ...
Brett Zamir
Mais hmm, Array.isArrayrevient truepour l '"objet" ici même si instanceof Arrayne le fait pas ...
Brett Zamir
@BrettZamir qui sonne comme un bug: D
Benjamin Gruenbaum
26

Surpris de ne pas voir -

console.log(
  Object.assign({}, ['a', 'b', 'c'])
)

Wylliam Judd
la source
Toute suggestion intelligente à créer { "first":"a", "second":"b","third":"c" }avec les clés en cours de correction - je cherche un destruct
mplungjan
@mplungjan Je suggère d'utiliser la réduction au lieu de l'attribution dans ce cas. Il existe probablement une bibliothèque qui vous permettrait d'énumérer chaque ordinal si nécessaire.
Wylliam Judd
J'ai eu un autre cas aujourd'hui. J'ai fini par poser une question à ce sujet: stackoverflow.com/questions/62197270/destruct-using-titles/…
mplungjan
23

nous pouvons utiliser Object.assignet array.reducefonctionner pour convertir un tableau en objet.

var arr = [{a:{b:1}},{c:{d:2}}] 
var newObj = arr.reduce((a, b) => Object.assign(a, b), {})

console.log(newObj)

KARTHIKEYAN.A
la source
C'est ce que je cherchais. Je n'avais pas besoin des indéces, j'avais besoin de transformer le tableau en paires clé-valeur conservées.
Mike K
18

J'ai fini par utiliser l'opérateur de répartition d'objets, car il fait partie de la norme ECMAScript 2015 (ES6).

const array = ['a', 'b', 'c'];
console.log({...array});
// it outputs {0:'a', 1:'b', 2:'c'}

Faites le violon suivant comme exemple.

locropulenton
la source
1
Je ne suis pas sûr de la performance de cela, mais parmi tant de conversion de tableau en objet (car je veux utiliser des objets pour tous mes codes pour le normaliser), c'est probablement le plus simple.
Quelqu'un de spécial
Comment est-ce mieux que n'importe laquelle des réponses déjà existantes qui ont donné la même solution?
Dan Dascalescu
17
Object.assign({}, ['one', 'two']); // {0: 'one', 1: 'two'}

Le moyen le plus simple en JavaScript moderne est d'utiliser Object.assign()qui ne fait que copier la clé: la valeur d'un objet à un autre. Dans notre cas, Arrayfait don de propriétés à neuf {}.

Appeiron
la source
Comment est-ce mieux que n'importe laquelle des réponses déjà existantes qui ont donné la même solution?
Dan Dascalescu
Dan Dascalescu au moment où j'ai ajouté la réponse, il n'y avait que la réponse ci-dessus concernant O.assignmais il manquait d'explication. Désormais, la déstructuration d'un tableau en objet est un moyen ( {...array})
Appeiron
14

Pour ES2016, opérateur réparti pour les objets. Remarque: c'est après ES6 et le transpilateur devra donc être ajusté.

const arr = ['a', 'b', 'c'];
const obj = {...arr}; // -> {0: "a", 1: "b", 2: "c"} 

Oleksii Trekhleb
la source
La réponse de l'opérateur de spread a déjà été donnée 2 ans plus tôt .
Dan Dascalescu
11

Cinq ans plus tard, il y a un bon moyen :)

Object.assign a été introduit dans ECMAScript 2015.

Object.assign({}, ['a', 'b', 'c'])
// {'0':'a', '1':'b', '2':'c'}
Paul Draper
la source
10

En utiliser javascript#forEachun peut le faire

var result = {},
    attributes = ['a', 'b','c'];

attributes.forEach(function(prop,index) {
  result[index] = prop;
});

Avec ECMA6:

attributes.forEach((prop,index)=>result[index] = prop);
RIYAJ KHAN
la source
10

FWIW, une autre approche récente consiste à utiliser le nouveau Object.fromEntriesavec Object.entriescomme suit:

const arr = ['a','b','c'];
arr[-2] = 'd';
arr.hello = 'e';
arr.length = 17;
const obj = Object.fromEntries(Object.entries(arr));

... qui permet d'éviter de stocker des éléments de tableau épars sous la forme undefinedou nullet préserve les clés non indexées (par exemple, entier non positif / non numérique).

On voudra peut-être ajouter arr.length, cependant, comme cela n'est pas inclus:

obj.length = arr.length;
Brett Zamir
la source
9

vous pouvez utiliser l'opérateur de propagation

x = [1,2,3,10]
{...x} // {0:1, 1:2, 2:3, 3:10}
noel zubin
la source
1
Cette réponse a déjà été donnée plusieurs fois.
Dan Dascalescu
9

Si vous utilisez ES6, vous pouvez utiliser Object.assign et l'opérateur d'étalement

{ ...['a', 'b', 'c'] }

Si vous avez un tableau imbriqué comme

var arr=[[1,2,3,4]]
Object.assign(...arr.map(d => ({[d[0]]: d[1]})))
murmure naika k
la source
1
Non seulement vos noms de variables sont différents, mais votre exemple ne fonctionnera pas, la création d'une carte à partir du constructeur nécessite initialement un tableau de valeurs-clés 2D. new Map([['key1', 'value1'], ['key2', 'value2']]);
Shannon Hochkins
5

Un rapide et sale:

var obj = {},
  arr = ['a','b','c'],
  l = arr.length; 

while( l && (obj[--l] = arr.pop() ) ){};
Micro
la source
Je pense que vous avez oublié de tester cela; il produit {0:"c", 1:"b", 2:"a"}. Vous voulez soit unshiftau lieu de popou (mieux) commencer par i=arr.length-1et décrémenter à la place.
Phrogz
ouais .. juste changé, mais ensuite ça devient moins intéressant: /
Mic
Pourrait même le faire l = arr.length, et puis while (l && (obj[--l] = arr.pop())){}(je me rends compte que c'est vieux, mais pourquoi ne pas le simplifier encore plus).
Qix - MONICA A ÉTÉ BRUÉE
2
@Qix, Nice shortening
Mic
4

Rapide et sale # 2:

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

while( a[i] ) { s[i] = a[i++] };
lordkrandel
la source
Pourquoi utilisez-vous la notation virgule?
Conner Ruhl
3
Préférence personnelle d'avoir la virgule en tête sur la ligne suivante. Je trouve cette notation plus facile à lire.
BingeBoy
1
La boucle s'arrêtera si le tableau contient une valeur falsifiée. Vous devriez vérifier i < a.lengthau lieu de a[i].
Oriol
4

Depuis Lodash 3.0.0, vous pouvez utiliser _.toPlainObject

var obj = _.toPlainObject(['a', 'b', 'c']);
console.log(obj);
<script src="https://cdn.jsdelivr.net/lodash/4.16.4/lodash.min.js"></script>

acontell
la source
3

Voici une fonction récursive que je viens d'écrire. C'est simple et ça marche bien.

// Convert array to object
var convArrToObj = function(array){
    var thisEleObj = new Object();
    if(typeof array == "object"){
        for(var i in array){
            var thisEle = convArrToObj(array[i]);
            thisEleObj[i] = thisEle;
        }
    }else {
        thisEleObj = array;
    }
    return thisEleObj;
}

Voici un exemple ( jsFiddle ):

var array = new Array();
array.a = 123;
array.b = 234;
array.c = 345;
var array2 = new Array();
array2.a = 321;
array2.b = 432;
array2.c = 543;
var array3 = new Array();
array3.a = 132;
array3.b = 243;
array3.c = 354;
var array4 = new Array();
array4.a = 312;
array4.b = 423;
array4.c = 534;
var array5 = new Array();
array5.a = 112;
array5.b = 223;
array5.c = 334;

array.d = array2;
array4.d = array5;
array3.d = array4;
array.e = array3;


console.log(array);

// Convert array to object
var convArrToObj = function(array){
    var thisEleObj = new Object();
    if(typeof array == "object"){
        for(var i in array){
            var thisEle = convArrToObj(array[i]);
            thisEleObj[i] = thisEle;
        }
    }else {
        thisEleObj = array;
    }
    return thisEleObj;
}
console.log(convArrToObj(array));

Résultats: Tableau récursif à l'objet

JVE999
la source
Fonctionne très bien. Merci
Hanmaslah
Cela devrait être plus haut, si vous en avez ['a' = '1', 'b' = '2', 'c' = '3']et que vous voulez que {a: 1, b: 2, c: 3}cela fonctionne parfaitement.
Wanjia
3
.reduce((o,v,i)=>(o[i]=v,o), {})

[docs]

ou plus verbeux

var trAr2Obj = function (arr) {return arr.reduce((o,v,i)=>(o[i]=v,o), {});}

ou

var transposeAr2Obj = arr=>arr.reduce((o,v,i)=>(o[i]=v,o), {})

le plus court avec vanille JS

JSON.stringify([["a", "X"], ["b", "Y"]].reduce((o,v,i)=>{return o[i]=v,o}, {}))
=> "{"0":["a","X"],"1":["b","Y"]}"

un exemple plus complexe

[["a", "X"], ["b", "Y"]].reduce((o,v,i)=>{return o[v[0]]=v.slice(1)[0],o}, {})
=> Object {a: "X", b: "Y"}

encore plus court (en utilisant function(e) {console.log(e); return e;}=== (e)=>(console.log(e),e))

 nodejs
> [[1, 2, 3], [3,4,5]].reduce((o,v,i)=>(o[v[0]]=v.slice(1),o), {})
{ '1': [ 2, 3 ], '3': [ 4, 5 ] }

[/ docs]

test30
la source
Que vouliez-vous [/docs]? Il serait plus utile de rendre les extraits de code exécutables.
Dan Dascalescu du
3

Je le ferais simplement avec Array.of(). Array of a la capacité d'utiliser son contexte comme constructeur.

NOTE 2 La fonction of est une méthode d'usine intentionnellement générique; il ne nécessite pas que sa valeur soit le constructeur Array. Par conséquent, il peut être transféré ou hérité par d'autres constructeurs qui peuvent être appelés avec un seul argument numérique.

Nous pouvons donc nous lier Array.of()à une fonction et générer un objet de type tableau.

function dummy(){};
var thingy = Array.of.apply(dummy,[1,2,3,4]);
console.log(thingy);

En utilisant Array.of() on peut même faire un sous-classement de tableau .

Redu
la source
3

Si vous pouvez utiliser Mapou Object.assign, c'est très simple.

Créez un tableau:

const languages = ['css', 'javascript', 'php', 'html'];

Ce qui suit crée un objet avec l'index comme clés:

Object.assign({}, languages)

Répliquez la même chose que ci-dessus avec Maps

Convertit en un objet basé sur un index, {0 : 'css'}etc.

const indexMap = new Map(languages.map((name, i) => [i, name] ));
indexMap.get(1) // javascript

Convertir en un objet basé sur une valeur, {css : 'css is great'}etc.

const valueMap = new Map(languages.map(name => [name, `${name} is great!`] ));
valueMap.get('css') // css is great
Shannon Hochkins
la source
3

Une méthode simple et effrontée de convertir rapidement un tableau d'éléments en un objet

function arrayToObject( srcArray ){
    return  JSON.parse( JSON.stringify( srcArray ) );
}

Puis l'utiliser comme ça ...

var p = [0,2,3,'pork','pie',6];
obj = new arrayToObject( p );
console.log( obj[3], obj[4] )
// expecting `pork pie`

Production:

pork pie

Vérification du type:

typeof obj
"object"

ET les choses ne seraient pas complètes s'il n'y avait pas de méthode prototype

Array.prototype.toObject =function(){
    return  JSON.parse( JSON.stringify( this ) );
}

Utilisation comme:

var q = [0,2,3,'cheese','whizz',6];
obj = q.toObject();
console.log( obj[3], obj[4] )
// expecting `cheese whizz`

Production:

cheese whizz

* REMARQUE: il n'y a pas de routine de nommage, donc si vous voulez avoir des noms spécifiques, vous devrez continuer à utiliser les méthodes existantes ci-dessous.


Méthode plus ancienne

Cela vous permet de générer à partir d'un tableau un objet avec des clés que vous définissez dans l'ordre que vous souhaitez.

Array.prototype.toObject = function(keys){
    var obj = {};
    var tmp = this; // we want the original array intact.
    if(keys.length == this.length){
        var c = this.length-1;
        while( c>=0 ){
            obj[ keys[ c ] ] = tmp[c];
            c--;
        }
    }
    return obj;
};

result = ["cheese","paint",14,8].toObject([0,"onion",4,99]);

console.log(">>> :" + result.onion); affichera "paint", la fonction doit avoir des tableaux de longueur égale ou vous obtenez un objet vide.

Voici une méthode mise à jour

Array.prototype.toObject = function(keys){
    var obj = {};
    if( keys.length == this.length)
        while( keys.length )
            obj[ keys.pop() ] = this[ keys.length ];
    return obj;
};
Mark Giblin
la source
Cela détruit à la fois le contenu du tableau de clés et, malgré le commentaire interne, également le tableau de valeurs (son contenu). JavaScript fonctionne différemment de PHP avec JavaScript agissant automatiquement par référence sur les propriétés d'un objet / tableau.
Brett Zamir
Non, la routine fait des copies, l'original n'est pas touché.
Mark Giblin
Oui, l'original est touché. Voir jsfiddle.net/bRTv7 . Les longueurs de tableau finissent toutes les deux par 0.
Brett Zamir
Ok, la version éditée avec laquelle je viens de la changer ne détruit pas les tableaux, trouve étrange qu'elle ait dû faire ça.
Mark Giblin
1
Mise à jour de la méthode qui devrait être prise en charge dans les anciens navigateurs car JSON existe depuis plus longtemps que ECMA a ajouté de nouvelles fonctionnalités de code
Mark Giblin
2

let i = 0;
let myArray = ["first", "second", "third", "fourth"];

const arrayToObject = (arr) =>
    Object.assign({}, ...arr.map(item => ({[i++]: item})));

console.log(arrayToObject(myArray));

Ou utiliser

myArray = ["first", "second", "third", "fourth"]
console.log({...myArray})

Bashirpour
la source
2

ES5 - Solution:

En utilisant la fonction de prototype de tableau «pousser» et «appliquer», vous pouvez remplir l'objet avec les éléments du tableau.

var arr = ['a','b','c'];
var obj = new Object();
Array.prototype.push.apply(obj, arr);
console.log(obj);    // { '0': 'a', '1': 'b', '2': 'c', length: 3 }
console.log(obj[2]); // c

SridharKritha
la source
Et si je veux me convertir en{ name: a, div :b, salary:c}
Prashant Pimpale
2

Plus de navigateur pris en charge et une manière plus flexible de faire cela en utilisant une boucle normale , quelque chose comme:

const arr = ['a', 'b', 'c'],
obj = {};

for (let i=0; i<arr.length; i++) {
   obj[i] = arr[i];
}

Mais la manière moderne pourrait également être d'utiliser l' opérateur de propagation , comme:

{...arr}

Ou attribuer un objet :

Object.assign({}, ['a', 'b', 'c']);

Les deux reviendront :

{0: "a", 1: "b", 2: "c"}
Alireza
la source
1

Vous pouvez utiliser une fonction comme celle-ci:

var toObject = function(array) {
    var o = {};
    for (var property in array) {
        if (String(property >>> 0) == property && property >>> 0 != 0xffffffff) {
            o[i] = array[i];
        }
    }
    return o;
};

Celui-ci devrait gérer plus efficacement les tableaux clairsemés.

Pablo Cabrera
la source
1

Voici une solution en coffeescript

arrayToObj = (arr) ->
  obj = {}
  for v,i in arr
    obj[i] = v if v?
  obj
David
la source
7
Qu'est-ce que le coffeescript? Nous parlons de JS! : D
m93a
2
C'est un petit langage qui se compile en JavaScript :)
David
6
Hmph, il utilise une notation étrange. J'aime plus JS ordinaire.
m93a
2
@David Vous pouvez faire toute la boucle for sur 1 ligne pour ne faire que 3 lignes. :) Exemple:obj[i] = v for v,i in arr when v?
XåpplI'-I0llwlg'I -