AngularJS从JSON统计特定ID数量时出现计数错误问题
解决JSON中ID计数错误的问题
嗨,我看到你在统计inputId出现次数时遇到了计数偏差的问题,咱们来拆解原因并搞定它!
问题根源
你推测的没错——问题出在AngularJS的filter过滤器上!默认情况下,这个过滤器是模糊匹配模式:当你用{ inputId: "3" }作为条件时,它会把所有inputId字符串里包含"3"的项都匹配进来,比如"235"里的"3"也会被算进去,所以原本应该是3次的"3",最后变成了3+4=7次。
两种修复方案
方案1:给filter开启精确匹配
Angular的filter支持第三个参数true,用来强制精确匹配。只要修改你的过滤代码,加上这个参数就行:
outputFilesCount = $filter('filter')( outputProducts, { inputId: copyOfOutputData[i] }, true // 关键:开启精确匹配,只找完全相等的inputId ).length;
这样修改后,filter就只会匹配inputId完全等于目标值的项,计数就准确了。
方案2:手动统计(更高效)
如果你的数据量比较大,多次调用filter会重复遍历数组,有点浪费性能。咱们可以用一个对象来一次性统计所有inputId的次数,代码更简洁高效:
var outputProducts = [ { outputId:'1', inputId: '3', opName: "outMacy" }, { outputId:'2', inputId: '3', opName: "outMacy2" }, { outputId:'3', inputId: '3', opName: "outMacy3" }, { outputId:'4', inputId: '235', opName: "EXPENCE" }, { outputId:'5', inputId: '235', opName: "opEXPENCE" }, { outputId:'6', inputId: '235', opName: "opEXPENCE1" }, { outputId:'8', inputId: '235', opName: "opEXPENCE3" }, { outputId:'7', inputId: '215', opName: "JCPenny" } ]; $scope.outputProducts = outputProducts; // 第一步:用对象统计每个inputId的出现次数 const countMap = {}; outputProducts.forEach(item => { const id = item.inputId; countMap[id] = (countMap[id] || 0) + 1; }); // 第二步:把统计结果转换成你需要的数组格式 $scope.inputFilesWithCount = Object.keys(countMap).map(id => ({ name: id, shownName: countMap[id] }));
这种方法只需要遍历一次数组,既避免了模糊匹配的坑,性能也更好。
最终效果
不管用哪种方案,最终得到的结果都会和你期望的一致:
[ { name: "3", shownName: 3 }, { name: "215", shownName: 1 }, { name: "235", shownName: 4 } ]
内容的提问来源于stack exchange,提问作者annie
相关产品推荐
相关产品推荐

