¿Cuál es la mejor manera de convertir:
['a','b','c']
a:
{
0: 'a',
1: 'b',
2: 'c'
}
javascript
arrays
node.js
object
David Hellsing
fuente
fuente
_.keyBy
(anteriormente_.indexBy
): lodash.com/docs#keyBy_.toPlainObject
. Ej:var myObj = _.toPlainObject(myArr)
Respuestas:
ECMAScript 6 presenta lo fácilmente polifilable
Object.assign
:El propio
length
propiedad de la matriz no se copia porque no es enumerable.Además, puede usar la sintaxis extendida ES6 para lograr el mismo resultado:
fuente
{ ...[sortedArray]}
Con una función como esta:
Su matriz ya es más o menos un simple objeto, pero las matrices tienen un comportamiento "interesante" y especial con respecto a las propiedades con nombre entero. Lo anterior le dará un objeto simple.
editar oh también es posible que desee tener en cuenta los "agujeros" en la matriz:
En tiempos de ejecución de JavaScript modernos, puede usar el
.reduce()
método:Ese también evita los "agujeros" en la matriz, porque así es como
.reduce()
funciona.fuente
[]
) si no va a utilizar claves de propiedad numéricas y la propiedad "length".const obj = arr.reduce((obj, cur, i) => { return { ...obj, [i]: cur }; }, {});
const obj = arr.reduce((obj, cur, i) => ({ ...obj, [i]: cur }), {});
Podrías usar un acumulador aka
reduce
.Pase 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 matriz es un conjunto de objetos de pares clave-valor:
Producirá:
{a: 1, b: 2, c: 3}
En aras de la integridad, le
reduceRight
permite iterar sobre su matriz en orden inverso: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 su objeto en una matriz, pase
[]
:Producirá:
[{1: "a"}, {2: "b"}, {3: "c"}]
A diferencia
map
,reduce
no se puede usar como un mapeo 1-1. Usted tiene control total sobre los elementos que desea incluir o excluir. Por lo tanto, lereduce
permite lograr lo quefilter
hace, lo que lo hacereduce
muy versátil:Producirá:
[{2: "b"}, {3: "c"}]
Precaución :
reduce
yObject.key
son parte deECMA 5th edition
; debe proporcionar un polyfill para los navegadores que no los admiten (especialmente IE8).Vea una implementación predeterminada por Mozilla .
fuente
Si estás usando jquery:
fuente
{0: 'a', 1: 'b', 2: 'c'}
resultado esperado.Para completar, ECMAScript 2015 (ES6) difusión. Requerirá un transpiler (Babel) o un entorno que ejecute al menos ES6.
fuente
Probablemente lo escribiría de esta manera (ya que muy rara vez no tendré la biblioteca de subrayado a mano):
fuente
obj=_.extend({},a);
haría el trabajo. Además, si está iterando a través de matrices, diría_.each
que sería más apropiado que_.map
. En general, esta no es una buena respuesta en varios niveles.Aquí hay un método O (1) ES2015 solo para completar.
fuente
length
propiedad propia . (3) El objeto es todavía una matriz,Array.isArray(arr) === true
. (4) Los comportamientos especiales de la matriz no se eliminan, por ejemplo,arr.length = 0
elimina todos los índices. (5) Por lo tanto, creo queObject.assign
es mucho mejor .Array.isArray
está regresandotrue
por el "objeto" aquí, aunqueinstanceof Array
no ...Sorprendido de no ver
fuente
{ "first":"a", "second":"b","third":"c" }
con las clavespodemos usar
Object.assign
yarray.reduce
funcionar para convertir una matriz a objeto.fuente
Terminé usando el operador de propagación de objetos, ya que es parte del estándar ECMAScript 2015 (ES6).
Hizo el siguiente violín como ejemplo.
fuente
Una manera fácil en JavaScript moderno es usar
Object.assign()
eso que no hace más que copiar clave: valor de un objeto a otro. En nuestro caso,Array
dona propiedades a nuevos{}
.fuente
O.assign
pero carecía de explicación. Hoy en día, la desestructuración de la matriz en un objeto es una forma ({...array}
)Para ES2016, operador de propagación para objetos. Nota: Esto es después de ES6 y, por lo tanto, será necesario ajustar el transpiler.
fuente
Cinco años después, hay una buena manera :)
Object.assign
fue introducido en ECMAScript 2015.fuente
Usar
javascript#forEach
uno puede hacer estoCon ECMA6:
fuente
FWIW, otro enfoque reciente es utilizar el nuevo
Object.fromEntries
junto conObject.entries
lo siguiente:... lo que permite evitar almacenar elementos de matriz dispersos como
undefined
onull
y conserva las teclas no indexadas (p. ej., números enteros no positivos / no numéricos).arr.length
Sin embargo, es posible que desee agregar , ya que eso no está incluido:fuente
puedes usar el operador de propagación
fuente
Si usa ES6, puede usar Object.assign y el operador de propagación
Si tiene una matriz anidada como
fuente
new Map([['key1', 'value1'], ['key2', 'value2']]);
Una rápida y sucia:
fuente
{0:"c", 1:"b", 2:"a"}
. Usted quiere enunshift
lugar depop
o (mejor) comenzar coni=arr.length-1
y disminuir en su lugar.l = arr.length
, y luegowhile (l && (obj[--l] = arr.pop())){}
(me doy cuenta de que esto es viejo, pero ¿por qué no simplificarlo aún más?).Rápido y sucio # 2:
fuente
i < a.length
lugar dea[i]
.A partir de Lodash 3.0.0 puede usar _.toPlainObject
fuente
Aquí hay una función recursiva que acabo de escribir. Es simple y funciona bien.
Aquí hay un ejemplo ( jsFiddle ):
Resultados:
fuente
['a' = '1', 'b' = '2', 'c' = '3']
y quieres que{a: 1, b: 2, c: 3}
esto funcione perfectamente.[docs]
o más detallado
o
el más corto con vainilla JS
algún ejemplo más complejo
incluso más corto (usando
function(e) {console.log(e); return e;}
===(e)=>(console.log(e),e)
)[/ docs]
fuente
[/docs]
? Sería más útil hacer que los fragmentos de código sean ejecutables.Yo haría esto simplemente con
Array.of()
. La matriz de tiene la capacidad de usar su contexto como constructor.Entonces podemos unirnos
Array.of()
a una función y generar una matriz como objeto.Al utilizar
Array.of()
uno, incluso se pueden hacer subclases de matrices .fuente
Si puedes usar
Map
oObject.assign
, es muy fácil.Crea una matriz:
Lo siguiente crea un objeto con índice como claves:
Replica lo mismo que arriba con Maps
Convierte a un objeto basado en índice,
{0 : 'css'}
etc.Convertir a un objeto basado en valores,
{css : 'css is great'}
etc.fuente
Un método simple y descarado para convertir rápidamente una matriz de elementos en un objeto
Luego usándolo así ...
Salida:
Comprobando el tipo:
Y las cosas no estarían completas si no hubiera un método prototipo
Usando como:
Salida:
* TENGA EN CUENTA que no hay una rutina de nombres, por lo que si desea tener nombres específicos, deberá continuar utilizando los métodos existentes a continuación.
Método antiguo
Esto le permite generar a partir de una matriz un objeto con las claves que defina en el orden que desee.
console.log(">>> :" + result.onion);
generará "pintura", la función debe tener matrices de igual longitud o obtendrá un objeto vacío.Aquí hay un método actualizado
fuente
O usar
fuente
ES5 - Solución:
Usando la función de prototipo de matriz 'push' y 'apply' puede llenar el objeto con los elementos de la matriz.
fuente
{ name: a, div :b, salary:c}
Más soporte para el navegador y una forma más flexible de hacerlo es usando un bucle normal , algo como:
Pero también la forma moderna podría ser usar el operador de propagación , como:
O asignar objeto :
Ambos volver :
fuente
Podrías usar una función como esta:
Este debería manejar matrices dispersas de manera más eficiente.
fuente
Aquí hay una solución en coffeescript
fuente
obj[i] = v for v,i in arr when v?