AngularJS按月份拆分ISO日期格式JSON数组问题排查
问题分析与解决方案
你遇到的核心问题是变量赋值覆盖,以及没必要的嵌套forEach导致的重复处理。
问题根源
- 单个对象赋值覆盖:你当前代码里,
vm.mai = vm.acoesAno[key];每次都会把遍历到的5月数据直接赋值给vm.mai,后面的5月数据会完全覆盖前面的,所以最后vm.mai只会保留最后一条5月记录,而非所有符合条件的数据。 - 嵌套
forEach冗余:外层已经在遍历vm.acoesAno,内层又重复遍历一遍,这不仅做了无用功,还可能导致同一数据被多次处理,加重覆盖问题。
修复后的代码
我们把每个月份变量改成数组,初始化后用push添加对应月份的数据,同时去掉多余的嵌套循环:
.then(function(resp) { vm.acoesAno = resp.data; // 提前初始化每个月份的空数组,避免undefined问题 vm.jan = []; vm.fev = []; vm.mar = []; vm.abr = []; vm.mai = []; vm.jun = []; vm.jul = []; vm.ago = []; vm.set = []; vm.out = []; vm.nov = []; vm.dez = []; // 仅需一层forEach遍历所有数据 angular.forEach(vm.acoesAno, function(value) { const date = new Date(value.data); const mes = date.getMonth(); // 月份从0开始(0=1月,4=5月) switch(mes) { case 0: vm.jan.push(value); break; case 1: vm.fev.push(value); break; case 2: vm.mar.push(value); break; case 3: vm.abr.push(value); break; case 4: vm.mai.push(value); break; case 5: vm.jun.push(value); break; case 6: vm.jul.push(value); break; case 7: vm.ago.push(value); break; case 8: vm.set.push(value); break; case 9: vm.out.push(value); break; case 10: vm.nov.push(value); break; case 11: vm.dez.push(value); break; } }); console.log("mes de maio: ", vm.mai); // 现在会输出所有5月数据组成的数组 })
关键改动说明
- 初始化数组:提前给每个月份变量创建空数组,确保后续可以用
push添加元素,而非覆盖单个对象。 - 单层遍历:去掉内层冗余的
forEach,只遍历一次vm.acoesAno,每条数据仅处理一次,效率更高。 - 用
push替代直接赋值:把符合月份条件的数据添加到对应数组中,所有同月份的数据都会被保留,不会被覆盖。 - 改用
switch语句:相比一堆if-else,代码更简洁易读,后期维护更方便。
效果验证
假设你的vm.acoesAno有两条5月的数据,执行后vm.mai会是一个包含这两个对象的数组,console.log会输出类似:
mes de maio: [ { "data" : "2018-05-06T03:00:00.000Z", "longitude" : "-52.018375", ... }, { "data" : "2018-05-18T03:00:00.000Z", "longitude" : "-52.021450", ... } ]
内容的提问来源于stack exchange,提问作者Fred
相关产品推荐
相关产品推荐

