2013-03-01 5 views
4

J'ai cette Couchdb vue qui ne fait pas ce que je m'attends. Il n'ajoute pas code, balance et session-params:Combinaison d'objets JavaScript dans Couchdb

function(doc) { 
    var params = doc.initial_url_params; //This is an object with many properties 
    params["code"] = doc.code; 
    params["balance"] = doc.balance; 
    params["session"] = doc.session.session_id; 
    emit(doc.code, params); 
} 

D'autre part, cette autre mise en œuvre fait l'affaire:

function(doc) { 
    var params = {}; 
    params["code"] = doc.code; 
    params["balance"] = doc.balance; 
    params["session"] = doc.session.session_id; 
    for (prop in doc.initial_url_params) { 
     params[prop] = doc.initial_url_params[prop]; 
    } 
    emit(doc.code, params); 
} 

Quelqu'un peut-il me dire pourquoi ces deux implémentations ne sont pas équivalent? Est-ce que je fais quelque chose de stupide avec Javascript ou est-ce une limitation spécifique de l'implémentation Javascript de Couchdb?

Par souci de clarté. Voici un exemple JSON doc:

{ 
    "_id": "207112eaaad136dca7b0b7b1c6356dc4", 
    "_rev": "3-e02de1f2f269642df98ab19ee023569b", 
    "session_loaded": true, 
    "balance": 20.48, 
    "code": "05428", 
    "initial_url_params": { 
     "page_id": "212" 
    }, 
    "session": { 
     "session_id": "207112eaaad136dca7b0b7b1c6356dc4", 
     "init": true 
    } 
} 
+0

Pour des raisons de clarté, pouvez-vous donner un exemple des données d'objet doc.initial_url_params? – Kristian

+0

S'il vous plaît voir mon édition – joscas

+1

Peut-être 'initial_url_params' est [gelé] (https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/freeze)/[sealed] (https: // developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/seal)? –

Répondre

2

La différence de vos 2 échantillons est que initial_url_params est une propriété d'un objet déjà défini doc, qui peut avoir été frozen avant d'être transmis à votre fonction. En tant que tel, vous ne pouvez pas lui ajouter de nouvelles propriétés, mais vous pouvez toujours les lire et les parcourir pour créer un nouvel objet (non gelé).

Et cela semble être le cas selon OP linked thread.


En JavaScript, les objets sont passés par référence si les propriétés devaient être ajoutées à l'objet doc, toutes les autres fonctions qui fonctionnent sur il serait également en mesure de voir les propriétés non standard et peut-être casser certaines carte les fonctions.

Voici un exemple de JS vanille du paragraphe précédent:

var doc = { foo: true }; 
function a(doc) { doc.bar = 1; } 
function b(doc) { console.log(doc); } 
a(doc); 
b(doc); // outputs: { foo: true, bar: 1 } 

Demo - dans l'exemple ci-dessus, b s'attendre à voir que les propriétés initialement définies dans doc, mais a il a modifié sous forme d'objets sont passés par référence. Ceci est une représentation trop simpliste, mais vous pouvez voir où cela peut conduire lorsqu'une fonction tente de mapper les propriétés de l'objet à une autre logique.