Javascript 组合多个对象以在节点中创建JSON对象
我正在尝试从多个在线图像/摄影源构建自己的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
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'}]