Javascript 组合多个对象以在节点中创建JSON对象

Javascript 组合多个对象以在节点中创建JSON对象,javascript,node.js,express,Javascript,Node.js,Express,我正在尝试从多个在线图像/摄影源构建自己的JSON对象。下面的代码应该解释我试图实现的目标: var searchUnsplash = require('./apis/unsplash'); var searchFlickr = require('./apis/flickr'); function combineObjs(callback) { var obj = {} var key = 'item'; obj[key] = []; searchFli

我正在尝试从多个在线图像/摄影源构建自己的JSON对象。下面的代码应该解释我试图实现的目标:

var searchUnsplash = require('./apis/unsplash');
var searchFlickr = require('./apis/flickr');

function combineObjs(callback) {

    var obj = {} 
    var key = 'item';
    obj[key] = []; 

    searchFlickr.searchFlickr(searchTerm, searchCount, searchPage,
        function (callback) { // each API call is in a separate file with these functions exported 

            obj[key].push(flickrObj); // this does not work 
            // console.log(flickrObj) // this works 
        });
    searchUnsplash.searchUnsplash(searchTerm, searchCount, searchPage, 
        function (callback) {

            obj[key].push(unsplashObj);
            // console.log(unsplashObj)
        });

    console.log(obj)
}

combineObjs();
目标是最终得到一个JSON对象,如下所示:

["item": {
    "id": 1,
    "title": 2,
    "content": 3,
    "source": "flickr"
}, 
"item": {
    "id": 1,
    "title": 2,
    "content": 3,
    "source": "unsplash"
}]
等,我可以用它来驱动我的前端

我是javascript的初学者,我只是在学习教程和文章中学到的东西,所以我可能完全使用了错误的方法来实现我的目标。乐意接受任何建议

搜索功能:

function searchUnsplash(term, count, page, callback) {
    request(`https://api.unsplash.com/search/photos/?per_page=${count}&page=${page}&query="${term}"&client_id=KEY&`, 

    function searchResult(error, response, body) {
        if (!error && response.statusCode == 200) {
        var info = JSON.parse(body)

        for ( var i = 0; i < info.results.length; i++) {

            obj = {
                id: `us-${info.results[i].id}`, 

            }
            callback(obj);

        }

    }

    })
}

module.exports.searchUnsplash = searchUnsplash;
函数searchUnsplash(术语、计数、页面、回调){
请求(`https://api.unsplash.com/search/photos/?per_page=${count}&page=${page}&query=“${term}”&client\u id=KEY&`,
函数搜索结果(错误、响应、正文){
如果(!error&&response.statusCode==200){
var info=JSON.parse(正文)
对于(var i=0;i
这太过分了,但会起作用。它可以反复使用D

运行代码段以查看结果

JSONBuilder类
{
构造函数(contents=null)
{
如果(!目录)
{
//无法公开访问的私有对象哈希
var objectHash={};
//藏匿物品
this.GetItem=函数(键)
{
如果(!key)抛出新错误(“传递了Null或未定义的key”);
let value=objectHash[key];
如果(!value)抛出新错误(`Key:${Key}未在JSON objectHash`中找到);
返回值;
}
//在对象哈希中设置一项
this.SetItem=函数(键、值)
{
如果(!key)抛出新错误(“传递了Null或未定义的key”);
如果(!value)抛出新错误(“找不到Null或未定义的键”);
objectHash[key]=值;
}
//从散列中删除项
this.DeleteItem=函数(键)
{
如果(!key)抛出新错误(“传递了Null或未定义的key”);
如果(!objectHash[key])抛出新错误(`key:${key}未在JSON objectHash`中找到);
objectHash.DeleteItem(键);
}
//将项目转换为JSON对象
this.Build=function()
{
返回JSON.stringify(objectHash);
}
}
其他的
{
//如果字符串作为参数传递,则从该参数重构
尝试
{
objectHash=JSON.parse(内容);
}
捕捉(错误)
{
log(“解析JSON内容失败”);
犯错误;
}
}
}
}
类项目
{
构造函数(id、来源、内容、标题)
{
这个.Id=Id;
this.Source=Source;
这个。内容=内容;
这个.Title=Title;
}
}
让builder=newjsonbuilder();
让itemContainer=[];
推送(新项目(1,‘闪烁’、‘填充’、‘项目1’);
推送(新项目(2,‘闪烁’、‘更多’、‘项目2’);
builder.SetItem('items',itemContainer);

console.log(builder.Build())首先,您的预期结果不正确。不能为单个数组项命名
“项”
。这是一个正确且有效的例子

[ {
    "id": 1,
    "title": 2,
    "content": 3,
    "source": "flickr"
}, 
{
    "id": 1,
    "title": 2,
    "content": 3,
    "source": "unsplash"
}]
其次,将JSON误认为是数据结构。JSON只是文本符号。那么,让我们先看看如何构建一个合适的数据数组

let results = [];
results.push( { id:1, title:2, content:3, source:"flickr" });
results.push( { id:2, title:4, content:6, source:"unsplash" });
然后使用
JSON.stringify(results)
结果编码为JSON

最后,将代码中的aynchronous调用与同步调用混合在一起。您需要将结果保存在单个函数的回调上,即当您真正异步获得响应时。此外,还需要计算挂起的结果,并在所有操作完成后调用最终回调

所以,把所有的部分放在一起,在一个虚构的例子中,我们只调用两次搜索函数,所以当两个结果组合在一起时我们回调

function combineObjs(callback) {  
   let results = [];   
   function partialResult(obj) { 
     results.push(obj); 
     if (results.length=2) callback(results);
   }; 
   searchFlickr(searchTerm, searchCount, searchPage, partialResult);
   searchUnsplash(searchTerm, searchCount, searchPage,partialResult);    
}

combineObjs( function(results) { console.log(JSON.stringify(results)) });

只是好奇为什么JSON数组中的
item={…}
?为什么不直接使用对象文本呢?你的最终结果甚至不是有效的JSON,所以我建议你更好地定义你想要的。是的,对不起,我打错了。漫长的一天这里发生了什么:
obj[key].push(flickrObj);//这不起作用
?而且,
combineObjs
函数似乎混合了同步和异步代码,并期望同步代码记录一些东西(
console.log(obj)
),但是当执行时,obj
很可能仍然是空的,因为异步代码还没有返回任何东西。嘿,爸,谢谢你的详细回答。我已经实现了它,并且它正在工作。虽然输出是一次又一次地迭代,但最后一个数组是我想要的。我在上面发布了我的搜索功能,如果您能找出发生这种情况的原因,请提前感谢
[{id:'us-frpxhahwwk'}][{id:'us-frpxhahwwk'},{id:'us-JXy99waA3Fo'}][id:'us-frpxhahwwwwk'},{id:'flkr 13545844805'},{id:'us-frpxy99waa3fo,{id:'flkr-13545844805'},{id:'flkr-3474831728'}]