我有这个Couchdb视图不符合我的预期.它不会向params添加代码,平衡和会话:
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
}
}
最佳答案 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已经通过引用传递对象来修改它.这是一种过于简单的表示,但是当函数尝试将对象的属性映射到其他逻辑时,您可以看到这可能导致的位置.