1

这个 Javascript 在我的 map 函数之外可以正常工作:

var cribs = ["list","tree"];

if ( cribs.some(function(i){return (new RegExp(i,'gi')).test("a long list of words");}) ) {
 console.log('match');
}

(它只是用数组中的值搜索一个字符串)。

虽然在我的地图功能中使用它不起作用:

var o = {};
o.map = function () { 
    if ( cribs.some(function(i){return (new RegExp(i,'gi')).test(this.name);}) ) {
        emit(this, 1) ;
    }
}
o.out = { replace: 'results' }
o.verbose = true;
textEntriesModel.mapReduce(o, function (err, model, stats) {
    model.find(function(err, data){
        console.log(data);
    });
})

它不发出任何东西,所以我有一个空的结果集。没有错误。

如果我不使用array.some,而是使用普通的正则表达式,那么它可以正常工作:

o.map = function () { 
    if(this.name.match(new RegExp(/list/gi))) {
        emit(this, 1) ;
    }
}

所以我的问题是,为什么上面的 array.some 函数在我的 map 函数中不起作用?

我有一长串需要匹配的单词,所以我真的不想单独为它们写一个正则表达式,上面应该可以工作。

这是我试图在我的地图函数中使用的函数的 jsfiddle:http: //jsfiddle.net/tnq7b/

4

1 回答 1

3

您需要通过将其添加到选项来使cribs该功能可用:mapscope

var cribs = ["list","tree"];
var o = {};
o.map = function () { 
    if (cribs.some(function(i){return (new RegExp(i,'gi')).test(this.name);})) {
        emit(this, 1);
    }
}
o.out = { replace: 'results' };
o.scope = { cribs: cribs };
o.verbose = true;
textEntriesModel.mapReduce(o, function (err, model, stats) {
    model.find(function(err, data){
        console.log(data);
    });
});
于 2013-02-19T19:54:58.030 回答