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

如何改造JS filterData函数实现嵌套结构下指定key的筛选

改造后的filterData函数实现

原代码问题说明

  • 类型判断顺序错误:typeof 检测数组的结果也是'object',所以原逻辑中Array.isArray的分支永远无法触发
  • 没有处理嵌套结构:无法识别外层容器对象和嵌套的目标数组,也没有递归处理深层属性

最终实现代码

function filterData(data, keys) {
  // 处理数组:遍历每一项递归处理
  if (Array.isArray(data)) {
    return data.map(item => filterData(item, keys))
  }

  // 处理对象(排除null值)
  if (typeof data === 'object' && data !== null) {
    // 判断当前对象是否包含需要保留的目标key
    const hasTargetKey = Object.keys(data).some(key => keys.includes(key))
    if (hasTargetKey) {
      // 是需要过滤的目标对象,仅保留指定key
      const filtered = {}
      keys.forEach(key => {
        if (data.hasOwnProperty(key)) {
          filtered[key] = data[key]
        }
      })
      return filtered
    }

    // 是上层容器对象,保留所有属性名,递归处理属性值
    const processedObj = {}
    Object.entries(data).forEach(([key, value]) => {
      processedObj[key] = filterData(value, keys)
    })
    return processedObj
  }

  // 基础类型(字符串、数字等)直接返回
  return data
}

逻辑说明

  1. 优先处理数组类型,对数组每一项递归调用处理函数,返回处理后的新数组
  2. 处理对象时先排除null值,再判断对象是否包含任意一个需要保留的目标key:
    • 判定为目标对象(示例中的汽车对象)时,仅保留keys列表指定的属性
    • 判定为容器对象(示例中badDataObject的外层对象)时,所有属性名全部保留,仅对属性值递归处理,完美适配cars/vans/trucks这类不固定的嵌套字段名
  3. 字符串、数字等基础类型直接原样返回

该实现兼容任意key列表,所有测试用例输出均符合预期。

内容的提问来源于stack exchange,提问作者johnny_mac

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 11:15:07