JavaScript中如何按条件返回对象内符合要求的键与值
提取数组中“孤独数字”的实现方法
你已经完成了最核心的数字出现频率统计逻辑,接下来只需要从统计好的频率对象里,把值等于1的对应键找出来就行。先说明原有代码的问题,再给出完整可运行的实现:
原有代码的两个问题
Object.values(obj)返回的是对象所有属性值组成的数组,比如你的测试用例执行后得到的是[2,1,2,2,1],数组直接和数字1做相等判断永远返回false,没法直接筛选出符合条件的项。- 最后一行
console.log的函数调用少了一个右括号,会直接触发语法错误。
最容易理解的实现步骤
不用记复杂API,顺着逻辑写即可:
- 频率统计完成后,先声明一个空数组,用来存最终找到的孤独数字
- 用
for...in循环遍历频率对象的每一个键,这个语法专门用来遍历普通对象,对新手非常友好 - 循环过程中判断:如果当前键对应的频率值等于1,说明这个数字只出现过一次,把键转成数字类型(对象的键默认会存成字符串,直接拿会得到字符串格式的数字)放进结果数组
- 遍历完成后返回结果数组即可
修正后的完整代码
function miti (a){ let obj = {}; let num; // 原有的频率统计逻辑本身是正确的 for(let i =0; i < a.length; i++){ num = a[i] if(obj[num] === undefined){ obj[num]= 1 } else { obj[num] ++ } } // 收集只出现1次的数字 let result = [] for (let key in obj) { if (obj[key] === 1) { // 键默认是字符串,转成数字再存入结果 result.push(Number(key)) } } return result } // 补全了缺失的右括号 console.log(miti([1,2,1,3,4,3,4,5])) // 运行输出:[2, 5],符合预期
补充:更简洁的写法(可选)
等你熟悉数组方法之后,也可以用Object.entries()直接拿到键值对数组,配合filter筛选,逻辑和上面完全一致:
function miti(a) { const freq = {} for (const num of a) { freq[num] = (freq[num] || 0) + 1 } return Object.entries(freq) .filter(([key, count]) => count === 1) .map(([key]) => Number(key)) }
刚开始学习优先掌握第一种循环写法即可,逻辑更直白,不容易出错。
内容的提问来源于stack exchange,提问作者noobieJavaScript
相关产品推荐
相关产品推荐

