JavaScript检查对象数组嵌套属性唯一性的函数运行异常如何解决
问题分析
你的代码存在3个核心错误,导致嵌套属性场景无法正常运行:
- 不支持嵌套属性路径解析:你直接用
v[keyName]读取属性,当keyName是spaceGeometry.ceilingHeight这类带点的嵌套路径时,代码会把整个字符串当作单个一级属性名查找,对象上不存在这个名字的一级属性,所以读取结果全是undefined。 - 错误使用数组的size属性:你把Set实例展开为数组后,用
uniqueValues.size判断长度,数组不存在size属性,只有length属性,所以uniqueValues.size !== 1的判断永远为真,函数无论什么情况都会返回null。 - 返回值的属性读取逻辑错误:返回语句里写的
arrToCheck[0].keyName是读取对象上名为keyName的固定属性,不是读取keyName变量对应的属性;同时includeFullObject是布尔参数,你写的arrToCheck[0].includeFullObject是读取对象上的includeFullObject属性,和参数逻辑完全不符。
修复后的代码
const getNullOrUniquePropertyValue = (arrToCheck, keyPath, includeFullObject = false) => { // 封装嵌套属性读取方法 const getPropByPath = (obj, path) => { return path.split('.').reduce((current, key) => { return current && current[key] !== undefined ? current[key] : undefined; }, obj); }; // 统一读取所有属性值 const valueSet = new Set(arrToCheck.map(item => getPropByPath(item, keyPath))); if (valueSet.size !== 1) return null; // 按参数返回对应结果 return includeFullObject ? arrToCheck[0] : getPropByPath(arrToCheck[0], keyPath); };
验证测试
一级属性调用
// 传入的spaces数组designHubProjectSpaceTypeId不统一,返回null,符合预期 getNullOrUniquePropertyValue(spaces, 'designHubProjectSpaceTypeId')
嵌套属性调用
// 传入的spaces数组ceilingHeight全为9,返回9 getNullOrUniquePropertyValue(spaces, 'spaceGeometry.ceilingHeight') // 返回完整的第一个对象 getNullOrUniquePropertyValue(spaces, 'spaceGeometry.ceilingHeight', true)
内容的提问来源于stack exchange,提问作者Glory Raj
相关产品推荐
相关产品推荐

