You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:39:07