Cas d'utilisation
Le cas d'utilisation consiste à convertir un tableau d'objets en une carte de hachage basée sur une chaîne ou une fonction fournie pour évaluer et utiliser comme clé dans la carte de hachage et la valeur en tant qu'objet lui-même. Un cas courant d'utilisation est la conversion d'un tableau d'objets en une carte de hachage d'objets.
Code
Voici un petit extrait en JavaScript pour convertir un tableau d'objets en une carte de hachage, indexé par la valeur d'attribut de l'objet. Vous pouvez fournir une fonction pour évaluer dynamiquement la clé de la carte de hachage (au moment de l'exécution). J'espère que cela aidera quelqu'un à l'avenir.
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;
};
Vous pouvez trouver l'essentiel ici: Convertit le tableau d'objets en HashMap .
javascript
arrays
hashmap
Naveen I
la source
la source
Réponses:
C'est assez banal à voir avec
Array.prototype.reduce
:Remarque:
Array.prototype.reduce()
est IE9 +, donc si vous devez prendre en charge des navigateurs plus anciens, vous devrez le remplir.la source
result = arr.reduce((map, obj) => (map[obj.key] = obj.val, map), {});
Pour les fans d'une ligne ES6: Dresult = new Map(arr.map(obj => [obj.key, obj.val]));
. Plus important encore, il est très clair qu'une carte est retournée.Array.prototype.reduce
tel que proposé par jmar777.Map
est en effet plus court mais c'est autre chose. Je me conformais à l'intention initiale. N'oubliez pas que ce n'est pas un forum, vous voudrez peut-être en savoir plus sur la structure SO Q / A.{ "foo": {key: 'foo', val: 'bar'}, "hello": {key: 'hello', val: 'world'} }
. Notez que chaque élément d'origine doit être conservé dans son intégralité . Ou en utilisant les données du Q:{"345": {id:345, name:"kumar"}, ...}
. CORRECTIF: changer le code pour êtremap[obj.key] = obj;
En utilisant ES6 Map ( assez bien pris en charge ), vous pouvez essayer ceci:
la source
Map
vous devez utiliserresult.get(keyName)
plutôt que justeresult[keyName]
. Notez également que n'importe quel objet peut être utilisé comme clé et pas seulement comme chaîne.var result = new Map(arr.map(i => [i.key, i.val] as [string, string]));
que certains pourraient trouver plus facile à comprendre.as [string, string]
Ajout d'un cast de type note .Result is: [["foo","bar"],["hello","world"]]
result
n'est pas un hachage comme demandé par l'OP.var result = new Map<string, string>(arr.map(i => [i.key, i.val]));
Avec lodash , cela peut être fait en utilisant keyBy :
la source
Utilisation d'ES6 spread + Object.assign:
la source
const hash = Object.assign({}, ...(<{}>array.map(s => ({[s.key]: s.value}))));
a dû faire ce changement pour travailler avec tapuscrit.Utilisation de l'opérateur d'étalement:
Démonstration de l'extrait de code sur jsFiddle .
la source
Vous pouvez utiliser Array.prototype.reduce () et la carte JavaScript réelle à la place juste un objet JavaScript .
Quelle est la différence entre Map And Object?
Auparavant, avant l'implémentation de Map en JavaScript, Object était utilisé comme Map en raison de leur structure similaire.
Selon votre cas d'utilisation, si vous devez avoir commandé des clés, avoir besoin d'accéder à la taille de la carte ou avoir des ajouts et des suppressions fréquents de la carte, une carte est préférable.
Citation du document MDN : les
objets sont similaires aux cartes dans la mesure où ils vous permettent de définir des clés pour des valeurs, de récupérer ces valeurs, de supprimer des clés et de détecter si quelque chose est stocké sur une clé. Pour cette raison (et parce qu'il n'y avait pas d'alternatives intégrées), les objets ont été utilisés comme cartes historiquement; cependant, il existe des différences importantes qui rendent préférable l'utilisation d'une carte dans certains cas:
la source
(mapAccumulator, obj) {...}
pour(mapAccumulator, obj) => {...}
Vous pouvez utiliser la nouvelle
Object.fromEntries()
méthode.Exemple:
la source
Version es2015:
la source
C'est ce que je fais en TypeScript j'ai une petite bibliothèque d'utils où je mets des choses comme ça
usage:
ou si vous avez un identifiant autre que 'id'
la source
Il existe de meilleures façons de le faire, comme expliqué par d'autres affiches. Mais si je veux m'en tenir à JS pur et à l'ancienne, alors voici:
la source
Si vous voulez convertir à la nouvelle ES6 Map faire:
Pourquoi devriez-vous utiliser ce type de carte? Cela dépend de vous. Jetez un oeil à cela .
la source
Utilisation de Javascript simple
la source
Avec
lodash
:la source
Une petite amélioration sur l'
reduce
utilisation:la source
essayer
Afficher l'extrait de code
la source
Voici un petit extrait que j'ai créé en javascript pour convertir un tableau d'objets en carte de hachage, indexé par la valeur d'attribut de l'objet. Vous pouvez fournir une fonction pour évaluer dynamiquement la clé de la carte de hachage (au moment de l'exécution).
Vous pouvez trouver l'essentiel ici: https://gist.github.com/naveen-ithappu/c7cd5026f6002131c1fa
la source
Array.prototype
!