javascript - 在 Couchdb 中组合 JavaScript 对象

标签 javascript json couchdb

我的 Couchdb View 没有达到我的预期。它不会将 codebalancesession 添加到 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/

相关文章:

javascript - 从 Angular JS 中的 URL 列表递归返回 JSON 对象

couchdb - 如何构建 CouchDB 的示例

erlang - CouchDB文档更新处理程序可以获取更新冲突吗?

ruby-on-rails - 像 CouchDB 这样的数据库的目的是什么?他们什么时候可以通过 Ruby On Rails 提供比标准数据库或对象(如数据库)更好的优势?

javascript - 编译并传递数组——AngularJS 和 PHP

javascript - 如何在 HTML 中制作 anchor 标记下拉列表

javascript - 两个不同脚本标签中的相同变量

php - 从 php 到 JavaScript 的数组

php - 为什么 FILE_APPEND 给我一个错误文件未找到,但 "true"工作正常但不追加

javascript - 使用 HTML5 从 iPhone 录制语音