纯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
相关产品推荐
相关产品推荐

