gpt4 book ai didi

javascript - CouchDB:将字段添加到 View 中的 "doc"

转载 作者:行者123 更新时间:2023-11-29 20:19:45 25 4
gpt4 key购买 nike

在我看来,我想创建一个新对象来返回,而不是传递给我的 map 函数的对象。我想做一些验证并向新对象添加一些字段。我的 View map 函数如下所示(没有减少):

function(doc) {
if(doc.type == "mytype") {
var newobj = null;
if( doc.someObjField ) {
newobj = doc.someObjField; //LINE 5: want a copy but get a reference
}
else {
newobj = new Object(); //field didn't exist create a new object
}

newobj.superId = doc._id; //these fields get added to the DB
newobj.superName = doc.name;
newobj.newField = doc.field;

emit(doc._id, newobj);
}
}

问题是当这个 View 运行时,它最终会向数据库中的文档添加一些新字段。在 Futon 中编辑文档时我看不到这些字段,但它们会显示在文档的每个 View 中。

我认为这是因为第 5 行创建了对文档该字段的引用而不是副本。这是否意味着我必须在我的所有 View 中包含一个 clone() 函数才能获得我想要的内容?也许我在想这个错误?

更新:我使用的是 CouchDB 1.0.0 版并升级到 1.0.1 版,似乎行为发生了变化。之前版本在一个 View 中修改“doc”时,修改会出现在所有 View 中。在最新版本中,情况似乎并非如此。

最佳答案

newobj = doc.someObjField 确实进行了引用而不是复制,因此您将不得不遍历 doc.someObjField 的属性并复制它们转移到一个新对象。

这不是那么简单,下面显示了一个如何制作浅克隆的示例:

// get the class of an object, this is a lot better than messing with typeof and instanceof
function is(type, obj) {
return Object.prototype.toString.call(obj).slice(8, -1) === type;
}

function copy(val) {
if (is('Object', val)) { // shallow clone objects
var obj = {};
for (var f in val) {
if (val.hasOwnProperty(f)) {
obj[f] = val[f];
}
}
return obj;

} else {
return is('Array', val) ? val.slice() : val; // shallow clone arrays
}
}

您的代码如下所示:

newobj = doc.someObjField ? copy(doc.someObjField) : {};

现在,如果您 someObjField 将对象或数组作为其属性,那么它们将再次只是引用,因此您必须递归地克隆它们。

关于javascript - CouchDB:将字段添加到 View 中的 "doc",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4673067/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com