请考虑以下代码:
module.exports = {
by_author: {
map: function(doc) {
if ('authors' in doc) {
doc.authors.forEach(emit);
}
}.toString(),
reduce: '_count'
},
by_subject: {
map: function(doc) {
if ('subjects' in doc) {
doc.subjects.forEach(function(subject){
emit(subject, subject);
subject.split(/\s+--\s+/).forEach(function(part){
emit(part, subject);
});
});
}
}.toString(),
reduce: '_count'
}
};
doc.authors.forEach(emit);
看起来不是有效的语法(或良好的编码),但它似乎在语法上是正确的。
我的问题是,这个的简写如下:
doc.authors.forEach(function(_doc) {
emit(_doc.id, _doc);
});
如果是这样,使用这种速记有什么好处吗?它是如何工作的?
参考。 https://wiki.apache.org/couchdb/Introduction_to_CouchDB_views#Map_Functions
答案 0 :(得分:3)
emit是CouchDB公开的函数。在JS函数中是一流的。 (并且可以作为参数传递给其他函数)
代替解释所有这些,我只会向您展示您的代码实际在做什么。 (如果你是新的话,请阅读更多关于JS中的函数的信息)
doc.authors.forEach(emit);
doc.authors.forEach(function (item, index, list) {
emit(author, index, list);
});
在JS中,传递给forEach
处理程序fn的参数是:
"some user"
)0
)[ "some user" ]
) emit()
函数只接受2个参数,因此只会忽略第3个参数。因此,对于单个项目数组,您将获得等效的emit("some user", 0)
。如果有多个项目,您也可以获得其他项目。