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

纯JavaScript实现嵌套对象按VName字段值过滤方案求助

解决方案

完全可以实现,针对你给出的固定层级结构,可以直接逐层遍历即可,不需要引入任何第三方依赖,纯原生JS实现如下:

方案1:适配当前固定结构(性能最优)

因为你的数据层级是固定的顶层数组 → Lines数组 → Fields数组,按层级遍历收集符合条件的字段即可:

/**
 * 按VName筛选符合条件的Field对象
 * @param {Array} data 原始解析后的JS数组
 * @param {String} targetVName 要匹配的VName值
 * @returns {Array} 符合条件的完整Field对象数组
 */
function filterFieldsByVName(data, targetVName) {
  const result = []
  // 遍历顶层数组
  data.forEach(topItem => {
    // 遍历Lines数组
    topItem.Lines?.forEach(lineItem => {
      // 遍历Fields数组
      lineItem.Fields?.forEach(field => {
        if (field.VName === targetVName) {
          result.push(field)
        }
      })
    })
  })
  return result
}

// 调用示例:筛选VName为oc_data的字段,yourData替换为你解析后的JS对象变量名
const matchedFields = filterFieldsByVName(yourData, 'oc_data')
console.log(matchedFields)

方案2:通用深层递归方案(适配任意嵌套结构)

如果后续数据结构变动,Fields可能出现在任意嵌套层级,可以用递归实现全局搜索:

/**
 * 深层递归遍历所有对象,筛选VName匹配的Field对象
 * @param {any} data 原始数据
 * @param {String} targetVName 要匹配的VName值
 * @param {Array} result 结果收集数组(递归内部用)
 * @returns {Array} 符合条件的完整Field对象数组
 */
function deepFilterFieldsByVName(data, targetVName, result = []) {
  // 数组遍历
  if (Array.isArray(data)) {
    data.forEach(item => deepFilterFieldsByVName(item, targetVName, result))
    return result
  }
  // 对象处理
  if (typeof data === 'object' && data !== null) {
    // 先判断当前对象是否是符合条件的Field
    if (data.VName === targetVName) {
      result.push(data)
    }
    // 递归遍历对象所有属性值
    Object.values(data).forEach(val => deepFilterFieldsByVName(val, targetVName, result))
  }
  return result
}

// 调用示例
const matchedFields = deepFilterFieldsByVName(yourData, 'oc_data')

说明

  • 两个方案返回的都是完整的Field对象,包含Format等所有嵌套属性
  • 代码中加了可选链?.做兼容,避免某个层级不存在时报错,如果你的运行环境不支持可选链,替换为普通的非空判断即可
  • 如果只需要第一个匹配的对象,遍历到匹配项直接return即可,不需要收集全部

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 05:45:03