如何统计JavaScript JSON对象中指定ownerId的出现次数?现有实现是否正确?
问题:统计指定ownerId的出现次数,我的代码实现是否正确?
需求:在给定的JSON对象中,根据输入值统计ownerId的出现次数。例如输入值为1时,结果应为3(因为ownerId=1共出现3次)。我写了使用find和reduce的代码,想确认是否正确。
我的现有代码
let inputValue = 1; let return = ""; const result = jsonResponse.jsonArray[0].info.find( (arr) => arr.ownderID === inputValue; ); var data = jsonResponse.jsonArray[0].info .reduce((counts, result) => { const inputItem = result[inputValue]; counts[inputItem] = (counts[inputItem] || 0) + 1; return counts; }, { }); return = data;
给定的JSON数据
const jsonResponse = { "jsonArray": [ { "info": [ { "ownerId": 1, "carType": "Nissan", "houseType": "Rancher" }, { "ownerId": 1, "carType": "Ford", "houseType": "Trailer" } ], "familyInfo": { "kids": 1, "tuition": "yes", "parentId": 7 } }, { "info": [ { "ownerId": 3, "carType": "Nissan", "houseType": "Single" } ], "familyInfo": { "kids": 4, "tuition": "no", "parentId": 11 } }, { "info": [ { "ownerId": 1, "carType": "Chevy", "houseType": "TownHome" } ] } ] }
代码问题分析
你的现有代码存在几个关键错误,无法正确实现需求:
- 拼写错误:
find方法里的ownderID是笔误,正确属性名是ownerId;且find是用来查找第一个匹配元素,不是统计次数,这段代码完全多余。 - 遍历范围错误:你只遍历了
jsonResponse.jsonArray[0].info,但jsonArray包含3个元素,每个都有info数组,会漏掉后面两个info里的ownerId。 - 统计逻辑错误:
reduce里的result[inputValue]是取对象中键为输入值的属性,比如输入1时会找result['1'],但你实际需要判断result.ownerId是否等于输入值再计数。 - 关键字误用:
return是JavaScript关键字,不能用作变量名,会直接导致语法错误。
正确实现方式
方式1:扁平化数组后统计
先把所有info数组的元素合并成一个数组,再用reduce统计指定ownerId的次数:
const inputValue = 1; // 合并所有info数组的元素 const allInfoItems = jsonResponse.jsonArray.flatMap(item => item.info); // 统计目标ownerId的出现次数 const count = allInfoItems.reduce((total, item) => { return item.ownerId === inputValue ? total + 1 : total; }, 0); console.log(count); // 输入1时输出3,输入3时输出1
方式2:嵌套遍历统计
直接遍历jsonArray的每个元素,再遍历其info数组计数:
const inputValue = 1; let count = 0; jsonResponse.jsonArray.forEach(arrItem => { arrItem.info.forEach(infoItem => { if (infoItem.ownerId === inputValue) { count++; } }); }); console.log(count); // 输入1时输出3,输入3时输出1
内容的提问来源于stack exchange,提问作者Jasper Learner
相关产品推荐
相关产品推荐

