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

JavaScript中如何按条件返回对象内符合要求的键与值

提取数组中“孤独数字”的实现方法

你已经完成了最核心的数字出现频率统计逻辑,接下来只需要从统计好的频率对象里,把值等于1的对应键找出来就行。先说明原有代码的问题,再给出完整可运行的实现:

原有代码的两个问题

  1. Object.values(obj)返回的是对象所有属性值组成的数组,比如你的测试用例执行后得到的是[2,1,2,2,1],数组直接和数字1做相等判断永远返回false,没法直接筛选出符合条件的项。
  2. 最后一行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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 08:39:10