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 に答える