Question

J'ai quelque chose de similaire à ceci:

...
meta: {
  'orderby' : 'firstname',
  'page' : 1,
  'per' : 10
}
...

Quand je reçois envoyer la demande à l'aide ajax, une partie de ma réponse contient certaines de ces données méta. Donc, j'Ecraser avec les nouveautés. Le serveur peut envoyer quelque chose comme:

meta: {
  'page' : 1,
  'per' : 10
}

Le problème est qu'il écrase la touche orderby être undefined. Je ne veux pas avoir le serveur principal envoyer tout, comment puis-je laisser la valeur d'une clé si la clé ne renvoyée?

Était-ce utile?

La solution

Comme vous l'avez dit que vous utilisez jQuery, vous pouvez utiliser sa fonction extend :

jQuery.extend(originalMeta, returnedMeta);

Cela ne fera que les propriétés Ecraser dans la cible (originalMeta, au-dessus) avec des propriétés de la source (returnedMeta dans ce qui précède) qui existent réellement. (Pas besoin d'affecter le résultat de la fonction à originalMeta, il est modifié en place.)

Il est aussi facile morte sans compter sur jQuery:

var name;
for (name in returnedMeta) {
    if (returnedMeta.hasOwnProperty(name)) {
        originalMeta[name] = returnedMeta[name];
    }
}

qui utilise une boucle de for..in à boucle par tous (dénombrables) properites sur returnedMeta, filtres toute hérite de son prototype (il n'a probablement pas reçu en héritage, mais ...), et pour ceux qui existent copie les valeurs en originalMeta.

Autres conseils

Vous pouvez utiliser extend() .

var meta = $.extend(meta, {
    'page': 1,
    'per': 10
});

T.J. Crowder que l'objet du premier argument est modifié, pas besoin de retour (si elle fonctionnera aussi bien).

Le problème est qu'il écrase la touche orderby être définie

Il ne remplace pas la propriété, elle écrasera toute Object. Lorsque vous accédez à la propriété d'un Object qui n'existe pas, vous obtenez undefined.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top