JavaScript中如何添加属性键值不覆盖?Blogger归档系统开发问题
解决Blogger API归档系统中同一年份月份被覆盖的问题
你遇到的问题很典型——每次循环都直接用archive[key] = { [NameOfMonth]: 1 }覆盖了同一年份的已有数据,导致最后只留下该年度最后一个处理的月份。要保留所有月份,我们需要先判断当前年份是否已经存在于archive对象中,再决定是创建新的年份对象还是往已有对象里添加月份。
修改后的代码
var archive = {}; if ("entry" in TotalFeed.feed) { var PostEntries = TotalFeed.feed.entry.length; for (var PostNum = 0; PostNum < PostEntries; PostNum++) { var ThisPost = TotalFeed.feed.entry[PostNum]; var key = ThisPost.published.$t.substring(0, 4); var MonthNames = ["January","February","March","April","May","June","July","August","September","October","November","December"]; var m = ThisPost.published.$t.substring(5, 7); var NameOfMonth = MonthNames[parseInt(m)-1]; // 关键改动:先检查年份是否已存在 if (!archive[key]) { // 如果年份不存在,初始化一个空对象 archive[key] = {}; } // 如果该月份已存在,计数+1;否则初始化为1 if (archive[key][NameOfMonth]) { archive[key][NameOfMonth]++; } else { archive[key][NameOfMonth] = 1; } } } console.log(archive);
代码解释
- 检查年份是否存在:
if (!archive[key])判断当前年份对应的键是否在archive里,如果不存在就创建一个空对象,这样后续的月份可以添加进去,不会被覆盖。 - 处理月份计数:对于每个月份,先检查它是否已经在对应年份的对象里,如果存在就把计数加1(支持同月份多篇文章的统计),不存在就初始化为1。
这样修改后,archive对象会完整保留每一年的所有有文章的月份,比如2011年如果有May和June的文章,就会显示为2011: {May: 1, June: 2}(假设June有2篇)。
内容的提问来源于stack exchange,提问作者Hkm Sadek
相关产品推荐
相关产品推荐

