66 votes

Existe-t-il un moyen de renommer les clés des objets js en utilisant l'underscore.js

J'ai besoin de convertir un objet js en un autre objet pour le transmettre à un post serveur où les noms des clés diffèrent par exemple

var a = {
    name : "Foo",
    amount: 55,
    reported : false,
    ...
    <snip/>
    ...
    date : "10/01/2001"
    } 

doit se transformer en

a = {
  id : "Foo",
  total : 55,
  updated: false,
  ...
  <snip/>
  ... 
  issued : "10/01/2001"
  }

où j'ai un objet de consultation disponible pour mettre en correspondance toutes les clés

var serverKeyMap = {
    name : "id",
    amount : "total",
    reported : "updated",
     ...
    date : "issue"
    }

Existe-t-il une fonction disponible dans underscore.js ou jQuery que je peux utiliser pour réaliser cette fonctionnalité ?

merci

8 votes

Pas l'underscore, mais lodash a _.mapKeys pour modifier les clés d'un objet.

76voto

Samir Aguiar Points 1651

Je sais que tu n'as pas mentionné lodash et les réponses résolvent déjà le problème, mais quelqu'un d'autre pourrait profiter d'une alternative.

Comme @CookieMonster l'a mentionné dans les commentaires, vous pouvez faire ceci avec _.mapKeys :

_.mapKeys(a, function(value, key) {
    return serverKeyMap[key];
});

Et le violon : http://jsfiddle.net/cwkwtgr3/

5 votes

Les effets secondaires sont importants avec celui-ci.

0 votes

@DFlores009 comme quoi ? Ce serait plus utile.

42voto

dule Points 1830

Comme pour @pimvdb, vous pouvez aussi le faire avec une _.reduce :

_.reduce(a, function(result, value, key) {
    key = map[key] || key;
    result[key] = value;
    return result;
}, {});

Violon : http://jsfiddle.net/T9Lnr/39/

0 votes

Semble toujours fonctionner pour moi @wegginho, il imprime à la console

0 votes

Je reçois une erreur indiquant que l'underscore n'est pas défini.

1 votes

Underscore est joint en tant que ressource externe, peut-être que l'endroit où il est hébergé est bloqué pour vous ? Essayez d'ouvrir le fichier pour voir si vous y avez accès.

38voto

pimvdb Points 66332

Pour autant que je sache, aucune fonction n'est intégrée à l'une ou l'autre de ces deux bibliothèques. Vous pouvez cependant créer la vôtre assez facilement : http://jsfiddle.net/T9Lnr/1/ .

var b = {};

_.each(a, function(value, key) {
    key = map[key] || key;
    b[key] = value;
});

11voto

user2387823 Points 141

Vous pouvez copier les valeurs dans les nouvelles propriétés avec le JavaScript standard, et supprimer les propriétés d'origine avec la fonction omettre comme suit :

a.id = a.name;
a.total = a.amount;
a.updated = a.reported;
a = _.omit(a, 'name', 'amount', 'reported');

0 votes

Veuillez ajouter une explication. Actuellement, votre réponse est signalée comme étant de "faible qualité" et pourrait être supprimée.

0 votes

En utilisant cette méthode, vous ne pouvez pas modifier toutes les clés qui ont plus d'une valeur.

3voto

Zin Kanzaki Points 31
// key_map: {old_name1: new_name1, ... }
function rename_keys(object, key_map, is_picked=false){
  keys = _.keys(key_map);
  new_keys = _.values(key_map);
  picked = _.pick(object, keys);
  renamed = _.object(new_keys, _.values(picked));
  if(is_picked) return renamed;

  return _.chain(object).omit(keys).extend(renamed).value();
}

Cela peut être plus lent que les réponses ci-dessus.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X