如何将循环生成的多个JavaScript对象合并为一个对象数组?
问题分析与修复方案
看起来你遇到的核心问题是数组初始化和元素收集的时机错误,导致每次循环都重置数组,还错误地尝试遍历单个对象而非数组。咱们一步步来修正:
你的代码里的关键问题:
var res = [];放在第一个for循环内部,意味着每次遍历视频条目时都会创建新的空数组,之前收集的元素全丢失了。- 第二个
for循环完全没必要,而且j < results是错误逻辑——results是单个对象,不是数组,没法用数字去比较长度。 sendSocketNotification放在循环内部,会导致每次遍历都发送一次只包含当前条目的数组,而非所有条目的完整集合。
修正后的代码:
parser(body, (err, result)=> { if(result.hasOwnProperty('feed')){ var entries = JSON.parse(JSON.stringify(result.feed.entry)); // 把结果数组初始化移到循环外面,确保只创建一次 var res = []; for(var i = 0; i < entries.length; i++){ var tube = entries[i]; var tLink = tube.link[0].$.href; var title = tube.title; var id = tube['yt:videoId'][0]; var pic = tube['media:group'][0]['media:thumbnail'][0].$.url; var videoItem = { url : tLink, title : title[0], thumb: pic, id: id }; // 直接把单个对象push到结果数组里 res.push(videoItem); } // 等所有条目都处理完,再统一发送完整数组 this.sendSocketNotification("TUBE_RESULT", res); } });
主要修改点说明:
- 数组初始化移到循环外:
res = []只执行一次,后续所有视频条目都往同一个数组里添加。 - 移除无效的第二个循环:不需要遍历单个对象,直接把
videoItem(我重命名了变量,让语义更清晰)push到数组即可。 - 延迟发送通知:把
sendSocketNotification移到第一个for循环外面,确保所有条目处理完成后,再发送包含所有对象的完整数组。
这样修改后,res数组就会包含所有解析出来的视频对象,最后一次性发送出去,就能得到你想要的对象数组啦。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

