4

私は、期待どおりに動作しないこのCouchdbビューを持っています。codebalanceおよび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);
}

これら2つの実装が同等ではない理由を誰か教えてもらえますか? 私は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
   }
}
4

1 に答える 1

2

2 つのサンプルの違いはinitial_url_params、既に定義されている object のプロパティであり、関数に渡される前に凍結docされている可能性があることです。そのため、新しいプロパティを追加することはできませんが、これらを読み取って反復処理し、新しい (凍結されていない) オブジェクトを構築することはできます。

OPのリンクされたスレッドによると、これは事実のようです。


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 }

デモ- 上記の例でbは、 で最初に定義されたプロパティのみが表示されると予想されますが、オブジェクトが参照によって渡されるため、変更されていますdocaこれは非常に単純化された表現ですが、関数がオブジェクトのプロパティを他のロジックにマップしようとすると、どこにつながるかがわかります。

于 2013-03-01T23:20:34.040 に答える