将新元素附加到数组中的对象

Appending new Elements to Objects in Array

几天来我一直对这个循环感到困惑,无法完全满足我的需要。

我遍历我的搜索结果数组 (mdb_results) 并从每个对象中提取一个 .name 用作 Google CSE 图像中的 _search 术语搜索。

Th CSE returns 另一个数组 (cse),我想将其附加到我从中提取 _search 项 (mdb_results[i]) 的对象。

router.get('/json', function(req, res, next) {
var ImageSearch = require('node-google-image-search');
MongoClient.connect(url, function(err,db){
  db.collection('mycatalog')
    .find({$text: {$search:"FOO" }})
    .toArray(function(err, mdb_results){    
        for (var i=0; i<mdb_results.length; i++){           
            var _search =  mdb_results[i].name ;

            ImageSearch(_search, function(cse){

               // How to add cse.img to mdb_results[i].images ??
               //    mdb_results[i].images = cse;
               // gives undefined

            },0,2);  
        };
        res.send(mdb_results);
        });
    });
});

我的初始 mdb_results 看起来像这样。

[{"name":"FOO"},{"name":"FOOOO"}]

我正在努力实现这样的目标,

[{"name":"FOO", 
  "images":[{"img1":"http://thumbnail1"},{"img2":"http://thumbnail2"}]
},
{"name":"FOOOO", 
  "images":[{"img1":"http://thumbnaila"},{"img2":"http://thumbnailb"}]
}]

任何人都可以告诉我如何实现这个吗?

谢谢

问题是您希望异步操作同步工作:

router.get('/json', function(req, res, next) {
var ImageSearch = require('node-google-image-search');
MongoClient.connect(url, function(err,db){
  db.collection('mycatalog')
    .find({$text: {$search:"FOO" }})
    .toArray(function(err, mdb_results){    
        for (var i=0; i<mdb_results.length; i++){           
            var _search =  mdb_results[i].name ;
            // This search is asynchronous, it won't have returned by the time
            // you return the result below.
            ImageSearch(_search, function(cse){

               // How to add cse.img to mdb_results[i].images ??
               //    mdb_results[i].images = cse;
               // gives undefined

            },0,2);  
        };
        // At this point, ImageSearch has been called, but has not returned results.
        res.send(mdb_results);
        });
    });
});

您将需要使用 promises 或 async 库。

这是一个例子:

router.get('/json', function(req, res, next) {
var ImageSearch = require('node-google-image-search');
MongoClient.connect(url, function(err,db){
  db.collection('mycatalog')
    .find({$text: {$search:"FOO" }})
    .toArray(function(err, mdb_results){
        // async.forEach will iterate through an array and perform an asynchronous action.
        // It waits for you to call callback() to indicate that you are done
        // rather than waiting for it to execute synchronously.
        async.forEach(mdb_results, function (result, callback) {
            ImageSearch(result.name, function(cse){
               // This code doesn't get executed until the network call returns results.
               result.images = cse;
               // This indicate that you are done with this iteration.
               return callback();
            },0,2);  
        },
        // This gets call once callback() is called for each element in the array,
        // so this only gets fired after ImageSearch returns you results.
        function (err) {
            res.send(mdb_results);
        });
    });
});