Caso de uso
El caso de uso es convertir una matriz de objetos en un mapa hash basado en una cadena o función proporcionada para evaluar y usar como la clave en el mapa hash y el valor como un objeto en sí mismo. Un caso común de usar esto es convertir una matriz de objetos en un mapa hash de objetos.
Código
El siguiente es un pequeño fragmento en JavaScript para convertir una matriz de objetos en un mapa hash, indexado por el valor del atributo del objeto. Puede proporcionar una función para evaluar la clave del mapa hash dinámicamente (tiempo de ejecución). Espero que esto ayude a alguien en el futuro.
function isFunction(func) {
return Object.prototype.toString.call(func) === '[object Function]';
}
/**
* This function converts an array to hash map
* @param {String | function} key describes the key to be evaluated in each object to use as key for hashmap
* @returns Object
* @Example
* [{id:123, name:'naveen'}, {id:345, name:"kumar"}].toHashMap("id")
* Returns :- Object {123: Object, 345: Object}
*
* [{id:123, name:'naveen'}, {id:345, name:"kumar"}].toHashMap(function(obj){return obj.id+1})
* Returns :- Object {124: Object, 346: Object}
*/
Array.prototype.toHashMap = function(key) {
var _hashMap = {}, getKey = isFunction(key)?key: function(_obj){return _obj[key];};
this.forEach(function (obj){
_hashMap[getKey(obj)] = obj;
});
return _hashMap;
};
Puede encontrar la esencia aquí: Convierte una matriz de objetos en HashMap .
javascript
arrays
hashmap
Naveen I
fuente
fuente
Respuestas:
Esto es bastante trivial que ver con
Array.prototype.reduce
:Nota:
Array.prototype.reduce()
es IE9 +, por lo que si necesita admitir navegadores antiguos, deberá rellenarlo.fuente
result = arr.reduce((map, obj) => (map[obj.key] = obj.val, map), {});
Para los fanáticos de ES6 one-liner: Dresult = new Map(arr.map(obj => [obj.key, obj.val]));
. Lo más importante, deja muy claro que se está devolviendo un mapa.Array.prototype.reduce
como lo propuso jmar777.Map
es de hecho más corto pero es una cosa diferente. Me mantenía en línea con la intención original. Recuerde que este no es un foro, es posible que desee leer más sobre la estructura SO Q / A.{ "foo": {key: 'foo', val: 'bar'}, "hello": {key: 'hello', val: 'world'} }
. Tenga en cuenta que cada elemento original debe mantenerse en su totalidad . O el uso de los datos del Q:{"345": {id:345, name:"kumar"}, ...}
. REVISIÓN: Cambiar el código para sermap[obj.key] = obj;
Usando ES6 Map ( bastante bien soportado ), puedes probar esto:
fuente
Map
necesita usarresult.get(keyName)
en lugar de soloresult[keyName]
. También tenga en cuenta que cualquier objeto puede usarse como clave y no solo como una cadena.var result = new Map(arr.map(i => [i.key, i.val] as [string, string]));
que algunos podrían encontrar más fácil de entender. Notaas [string, string]
tipo elenco añadido.Result is: [["foo","bar"],["hello","world"]]
result
no es un hash según lo solicitado por el OP.var result = new Map<string, string>(arr.map(i => [i.key, i.val]));
Con lodash , esto se puede hacer usando keyBy :
fuente
Usando ES6 spread + Object.assign:
fuente
const hash = Object.assign({}, ...(<{}>array.map(s => ({[s.key]: s.value}))));
tuvo que hacer este cambio para trabajar con mecanografiado.Usando el operador de propagación:
Demostración del fragmento de código en jsFiddle .
fuente
Puede usar Array.prototype.reduce () y el Mapa de JavaScript real en lugar de solo un Objeto de JavaScript .
¿Qué es diferente entre mapa y objeto?
Anteriormente, antes de que Map se implementara en JavaScript, Object se usaba como Map debido a su estructura similar.
Dependiendo de su caso de uso, si necesita tener claves ordenadas, necesita acceder al tamaño del mapa o tener que agregarlo y eliminarlo con frecuencia, es preferible un Mapa.
Cita del documento MDN : los
objetos son similares a Maps en que ambos le permiten establecer claves en valores, recuperar esos valores, eliminar claves y detectar si algo está almacenado en una clave. Debido a esto (y porque no había alternativas incorporadas), los Objetos se han utilizado como Mapas históricamente; sin embargo, existen diferencias importantes que hacen que el uso de un mapa sea preferible en ciertos casos:
fuente
(mapAccumulator, obj) {...}
para(mapAccumulator, obj) => {...}
Puedes usar el nuevo
Object.fromEntries()
método.Ejemplo:
fuente
Versión es2015:
fuente
Esto es lo que estoy haciendo en TypeScript. Tengo una pequeña biblioteca de utilidades donde pongo cosas como esta.
uso:
o si tiene un identificador que no sea 'id'
fuente
Hay mejores maneras de hacer esto como lo explican otros carteles. Pero si quiero apegarme a JS puro y a la antigua, entonces aquí está:
fuente
Si desea convertir al nuevo mapa ES6, haga esto:
¿Por qué deberías usar este tipo de mapa? Bueno, eso depende de ti. Mira esto .
fuente
Usando Javascript simple
fuente
Con
lodash
:fuente
Una pequeña mejora en el
reduce
uso:fuente
tratar
Mostrar fragmento de código
fuente
El siguiente es un pequeño fragmento que he creado en JavaScript para convertir una matriz de objetos en un mapa hash, indexado por el valor del atributo del objeto. Puede proporcionar una función para evaluar la clave del mapa hash dinámicamente (tiempo de ejecución).
Puede encontrar la esencia aquí: https://gist.github.com/naveen-ithappu/c7cd5026f6002131c1fa
fuente
Array.prototype
!