1
votes

Comment mapper des paires clé / valeur d'une «carte» en JavaScript?

Comment mapper des paires clé / valeur d'une "carte" en JavaScript:

// ["a_1", "b_2", "c_3"]
map.map((key, value) => key + "_" + value);

J'ai besoin d'un mappeur contenant une paire clé / valeur à chaque itération:

var map = {"a": 1, "b": 2, "c": 3};

alert(JSON.stringify(map));


0 commentaires

4 Réponses :


5
votes

Ce n'est pas une carte, c'est un objet. (Vous pouvez envisager d'utiliser une Map code> , cependant.)

Pour obtenir ses propriétés sous forme de paires clé / valeur, vous pouvez utiliser Object.entries , auxquels vous pouvez ensuite appliquer map à:

var map = new Map([
  ["a", 1],
  ["b", 2],
  ["c", 3]
]);
map = Array.from(map.entries(), ([key, value]) => key + "_" + value);
console.log(map);

Object.entries est relativement nouveau, mais facilement polyfilled pour les environnements plus anciens.

Exemple en direct:

var map = {"a": 1, "b": 2, "c": 3};
map = Object.entries(map).map(([key, value]) => key + "_" + value);
console.log(map);

Ou, en utilisant une Map , vous pouvez utiliser sa méthode entries intégrée, qui renvoie un itérable, en le passant dans Array.from et en utilisant le rappel de mappage de Array.from :

map = Object.entries(map).map(([key, value]) => key + "_" + value);

(Ou développez l'itérable dans un tableau - [... map.entries ()] - et utilisez map dessus, mais ce qui précède évite un tableau à jeter temporaire.)

Dans les deux cas, j'utilise la déstructuration dans la liste des paramètres de la fonction flèche, qui reçoit un tableau dans [key, value] code > format.


0 commentaires

4
votes

Utilisez Object.entries code> , puis utilisez map sur la paire clé / valeur:

[
  [ "a", 1 ],
  [ "b", 2 ],
  [ "c", 3 ]
]

Object.entries renvoie:

const map = {"a": 1, "b": 2, "c": 3};
const mapped = Object.entries(map).map(([k,v]) => `${k}_${v}`);
console.log(mapped);

Ensuite, parcourez chacun de ces tableaux internes et créez la chaîne en utilisant littéraux de modèle


1 commentaires

c'est faux si la structure de données réelle est une carte, c'est la solution pour un objet



0
votes

Vous pouvez utiliser Object.keys qui donnera un tableau des clés présentes dans cet objet, puis utiliser la méthode de carte de tableau sur ce tableau et accéder à la valeur de chaque clé et créer une chaîne

var map = {
  "a": 1,
  "b": 2,
  "c": 3
};

let neObj = Object.keys(map).map(item => `${item}_${map[item]}`)

console.log(neObj)


6 commentaires

vous avez utilisé la syntaxe ES6, donc Object.entries () est une meilleure solution.


est-ce la raison du vote négatif?


@Alnitak raison étrange de rejeter toutes nos solutions de travail. Object.keys est ECMAScript 5.1 et a plus de support de navigateur, Object.entries est ES7 et ne fonctionne pas dans IE.


@Dominic L'OP a utilisé une fonction fléchée - le support IE n'est clairement pas un facteur.


@Dominic de toute façon, il y a en fait une bonne raison technique de recommander la méthode Object.keys , et c'est parce que les valeurs ne sont pas passées à l'appel .map directement le callback doit former une fermeture sur l'objet d'origine pour les obtenir, ce qui signifie qu'il doit être dans la même portée lexicale. Cela empêche l'utilisation d'une fonction réutilisable pour effectuer l'opération résultante sur les paires.


@Dominic c'est d'ailleurs pourquoi .map lui-même passe toujours le tableau d'origine comme troisième paramètre de rappel, de sorte que les fonctions de rappel en dehors de la portée lexicale puissent toujours accéder à ce tableau et ne pas avoir à former un fermeture dessus. Cependant, cela tombe lorsque le tableau que vous passez (dans ce cas, le tableau Object.keys () ne contient pas toutes les informations requises par le rappel.



2
votes

Vous pouvez prendre les entrées de l'objet et joindre les paires clé / valeur.

var map = { a: 1, b: 2, c: 3 },
    result = Object.entries(map).map(a => a.join('_'));
    
console.log(result);


1 commentaires

Cela produit définitivement la sortie demandée et est extrêmement facile à comprendre.