503 votos

Convertir una matriz en un objeto

Cuál es la mejor manera de convertir:

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

a:

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

485voto

Pointy Puntos 172438

Con una función como esta:

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

Su Array ya es más o menos un objeto, pero los arrays tienen un comportamiento "interesante" y especial con respecto a las propiedades con nombre de entero. Lo anterior le dará un objeto simple.

editar Ah, también es posible que quieras tener en cuenta los "agujeros" en el Array:

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

En los tiempos de ejecución modernos de JavaScript, se puede utilizar la función .reduce() método:

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

Ese también evita los "agujeros" en el Array, porque así .reduce() funciona.

278voto

roland Puntos 1433

Podrías utilizar un acumulador también conocido como 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"

Pasar un objeto vacío {} como punto de partida; luego "aumenta" ese objeto de forma incremental. Al final de las iteraciones, result será {"0": "a", "1": "b", "2": "c"}

Si su Array es un conjunto de objetos de par clave-valor:

[{ 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;
}, {});

producirá: {a: 1, b: 2, c: 3}

En aras de la exhaustividad, reduceRight le permite iterar sobre su Array en orden inverso:

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

producirá: {c:3, b:2, a:1}

Su acumulador puede ser de cualquier tipo para su propósito específico. Por ejemplo, para intercambiar la clave y el valor de tu objeto en un Array, pasa [] :

[{ 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

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

A diferencia de map , reduce no puede ser utilizado como un mapeo 1-1. Usted tiene pleno control sobre los elementos que desea incluir o excluir. Por lo tanto, reduce le permite lograr lo que filter hace, lo que hace que reduce muy versátil:

[{ 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

producirá: [{2: "b"}, {3: "c"}]

Precaución : reduce y Object.key forman parte de ECMA 5th edition debería proporcionar un polyfill para los navegadores que no los soportan (especialmente IE8).

Ver una implementación por defecto de Mozilla .

101voto

Max Puntos 2659

Si estás usando jquery:

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

47voto

Dave Dopson Puntos 16690

Yo probablemente lo escribiría así (ya que muy raramente no tendré la librería underscorejs a mano):

var _ = require('underscore');

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

3voto

Mark Giblin Puntos 29

Un método sencillo y descarado para convertir rápidamente una matriz de elementos en un objeto

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

Entonces, usándolo así...

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

La salida:

pork pie

Comprobando el tipo:

typeof obj
"object"

Y las cosas no estarían completas si no hubiera un método prototipo

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

Usando como:

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

La salida:

cheese whizz

*NOTA que no hay una rutina de nomenclatura, así que si quieres tener nombres específicos, entonces tendrás que seguir usando los métodos existentes más abajo.


Método antiguo

Esto le permite generar a partir de un Array un objeto con las claves que defina en el orden que desee.

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); dará como resultado "paint", la función tiene que tener arrays de igual longitud o se obtiene un objeto vacío.

He aquí un método actualizado

Array.prototype.toObject = function(keys){
    var obj = {};
    if( keys.length == this.length)
        while( keys.length )
            obj[ keys.pop() ] = this[ keys.length ];
    return obj;
};

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X