2013-03-01 58 views
4

结合JavaScript对象我有这个CouchDB的认为没有做什么,我的期望。它不添加codebalancesessionparamsCouchDB中

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); 
} 

在另一方面,这另一个实现的伎俩:

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); 
} 

谁能告诉我,为什么这两种实现都没有当量?我是用Javascript来做一些愚蠢的事情还是Couchdb的Javascript实现的一些特定限制?

为了清楚起见。下面是一个示例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

只是为了清楚起见,你能不能给doc.initial_url_params对象数据的样本? – Kristian 2013-03-01 23:01:07

+0

请看到我的编辑 – joscas 2013-03-01 23:04:52

+1

也许'initial_url_params'是[冻结](https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/freeze)/ [密封](https://开头developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/seal)? – 2013-03-01 23:10:18

回答

2

的差的2个样品中是initial_url_params是已经定义的对象doc,这可能被传递给函数之前一直frozen的性质。因此,你不能将新属性添加到它,但你仍然可以读取和遍历这些建新(解冻)对象。

,这似乎根据OP的linked thread是这种情况。


在JavaScript中,目的是通过引用传递所以如果性能是要被添加到所述doc对象,其上运行的所有其它功能也将能够看到这些非标准属性和可能打破一些地图功能。

这里的上段的香草JS例如:

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 - 在上面的例子中,b希望看到在doc只有最初定义的属性,但a已经修改了它作为对象传递引用。这是过于简单化的表示,但是当函数试图将对象的属性映射到其他逻辑时,您可以看到这可能导致哪里。