我的 Couchdb View 没有达到我的预期。它不会将 code
、balance
和 session
添加到 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 文档:
{
"_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
对象,所有对其进行操作的其他函数也将能够看到这些非标准属性,并且可能破坏一些 map 功能。
这是上面段落的普通 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
在传递对象时修改了它引用。这是一种过于简单化的表示,但是当函数尝试将对象的属性映射到其他逻辑时,您可以看到这可能会导致什么结果。
关于javascript - 在 Couchdb 中组合 JavaScript 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15168210/