我有一个如下对象:
var s = {
name: "and",
args: [
{
name:"or",
args:[
{
name:"eq",
args:["foo",3]
},
{
name:"eq",
args:["foo","bar"]
}
]
},
{
name:"lt",
args:["price",10]
}
]
}
我想编写一个将返回的函数:
{ $and: [
{ $or: [
{ foo: 3 },
{ foo: 'bar' }
]
},
{
price: { '$lt': 10 }
}
]
}
我可以毫不费力地做故事的访问方面:
function makeMongo( s ){
console.log("Visiting: ", s.name );
if( s.name == 'and' || s.name == 'or' ){
console.log("It's a boolean operator! ");
for( var i = 0, l = s.args.length; i < l; i ++ ){
console.log("Entering: ", s.args[ i ] );
makeMongo( s.args[ i ] );
}
} else {
console.log( "It's an operation!", s.args );
}
}
var r = makeMongo( s );
console.log( "Result: ", r );
然而,我正在认真地坚持故事的“回归有意义”的一面,如果令人沮丧的话。
这就是我提出的:
function makeMongo( s ){
console.log("Visiting: ", s.name );
if( s.name == 'and' || s.name == 'or' ){
console.log("It's a boolean operator! ");
var mongoName = '$' + s.name;
var v = {};
v[ mongoName ] = [];
for( var i = 0, l = s.args.length; i < l; i ++ ){
console.log("Entering: ", s.args[ i ] );
v[ mongoName ].push( makeMongo( s.args[ i ] ) );
}
return v;
} else {
console.log( "It's an operation!", s.args );
var v = {};
if( s.name == 'eq' ){
v[ s.args[ 0 ] ] = s.args[ 1 ];
} else if( s.name = 'lt' ){
v[ s.args[ 0 ] ] = {};
v[ s.args[ 0 ] ]['$lt'] = s.args[ 1 ];
}
return v;
}
}
var r = makeMongo( s );
然而,我不能说我喜欢它。 这有更好的模式吗?或者这实际上是“它是如何完成的”?
Merc的。