以预期格式打印JSON数组

时间:2016-06-08 07:18:57

标签: arrays json node.js express multidimensional-array

这是从我的表中获取详细信息的代码。

 function listshops(callback)
{   
 var array=[3,4];/*shopId*/
  async.each(array,function(dat,callback){

     async.parallel([

         function(callback){
            client.connection.query('select * from shop where shopId=?',dat,function(err,data1){
            callback(null,data1);

           });
        },       

         function (callback) {
            client.connection.query('select * from image where shopId=?',dat,function(err,data2){
            callback(null,data2);

           });
        }
     ],
     function(err,data)
     {
        var result = data.reduce(function(prev, curr) { /*merging the array*/
          return prev.concat(curr);
        });
        console.log(result);
     });
 });

}

我得到了像这样的输出:: http://i.stack.imgur.com/NVUAu.png

我想以下面的格式打印我的结果:

{
"shops": [
    {
        "shopId": "3",
        "shopName": "1",
        "address": "abc",
        "contactNumber":"1234"
        "images": [
            {
                "imageId": "1",
                "shopId": "3",
                "imageUrl": "aaa",
            },
            {
                "imageId": "2",
                "shopId": "3",
                "imageUrl": "bbb",
            },
        ]
    },
    {
        "shopId": "4",
        "shopName": "2",
        "address": "bbb",
        "contactNumber":"1234"
        "images": [
            {
                "imageId": "3",
                "shopId": "4",
                "imageUrl": "ccc",
            },
            {
                "imageId": "4",
                "shopId": "4",
                "imageUrl": "ddd",
            },
        ]
    },
]

我得到了值,但在获取值时出现了一些混淆。

1 个答案:

答案 0 :(得分:0)

您在这里有两个嵌套的异步任务,paralleleach

Parallel负责获取一个商店的商店信息和图像,并使用包含任务结果的双元素数组调用最终回调。

这是你最终的并行回调:

    function(err,data)
         {
            var result = data.reduce(function(prev, curr) { /*merging the array*/
              return prev.concat(curr);
            });
            console.log(result);
         });

data应该是一个双元素数组,其中元素0是商店,元素1是图像。你只需将它们连接在一起。如果您想要所需格式的图像,则应data[0].images = data[1]将图像密钥添加到您的商店。

到目前为止,这是一家商店。然后是外部each循环。您目前没有给出最终回调,也没有对结果做任何事情。

这样的事情:

     function listshops(callback)
{   
 var array=[3,4];/*shopId*/
  async.each(array,function(dat,eachCallback){

     async.parallel([

         function(parallelCallback){
            client.connection.query('select * from shop where shopId=?',dat,function(err,data1){
            parallelCallback(null,data1);

           });
        },       

         function (parallelCallback) {
            client.connection.query('select * from image where shopId=?',dat,function(err,data2){
            parallelCallback(null,data2);

           });
        }
     ],
     // this is the final callback for parallel
     function(err,parallelResult)
     {
        // construct one shop
        var shop = parallelResult[0];
        shop.image = parallelResult[1];
        // pass the shop info back as a result to each
        eachCallBack(shop);
     });
 },
 // this is the final callback for each
 function(err, eachResult) {
    // eachResult is an array with the shops returned from parallel callback
    var result = {
        shops: eachResult
    }

    return result
 }
 );

}

我无法测试这个,所以不要认为它是一个确切的解决方案,而是一个解释。我重命名了您的变量以便更好地理解,您不必在代码中执行此操作。要记住的关键是你在这里有两个嵌套的任务,比如一个嵌套循环,你还必须在两个层面上处理结果。