递归访问一个结构,同时创建另一个结构

时间:2014-12-10 06:51:52

标签: javascript recursion data-structures

我有一个如下对象:

  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的。

0 个答案:

没有答案