如何获取JavaScript嵌套对象的所有属性值(未知键名)
用ES6获取嵌套对象的所有属性值并转为数组
嘿,刚好能帮你解决这个嵌套对象取值的问题!咱们用ES6的特性就能轻松实现,核心思路是递归遍历所有层级的属性值,根据值的类型做不同处理,最终把所有值整理成一个一维数组。
实现代码
这里有两种ES6风格的写法,你可以按需选择:
写法一:forEach遍历版
const getAllValues = (obj) => { let result = []; // 直接获取对象的所有属性值(ES6 Object.values) Object.values(obj).forEach(value => { // 排除null,因为typeof null会返回'object' if (typeof value === 'object' && value !== null) { // 如果是数组,用flatMap递归处理每个元素并扁平化;普通对象则直接递归 result = result.concat(Array.isArray(value) ? value.flatMap(getAllValues) : getAllValues(value)); } else { // 非对象/数组类型,直接加入结果数组 result.push(value); } }); return result; };
写法二:reduce函数式版
如果喜欢更简洁的函数式写法,可以用Array.reduce:
const getAllValues = (obj) => Object.values(obj).reduce((acc, value) => { if (typeof value === 'object' && value !== null) { return acc.concat(Array.isArray(value) ? value.flatMap(getAllValues) : getAllValues(value)); } return acc.concat(value); }, []);
测试你的示例
把你的errorData代入测试:
var errorData = { "Message":"The request is invalid.", "ModelState":{ "account.Contact.PrimaryPhone":[ "Primary Phone is required.", "'Primary Phone' should not be empty." ] } }; const errors = getAllValues(errorData); console.log(errors); // 输出结果: // ["The request is invalid.", "Primary Phone is required.", "'Primary Phone' should not be empty."]
关键特性解释
Object.values(obj):ES6新增方法,直接返回对象所有属性值的数组,比Object.keys(obj).map(key => obj[key])更简洁。Array.flatMap():ES2019引入的方法,先对数组每个元素执行映射(这里是递归取值),然后自动扁平化一层,完美处理数组嵌套的情况。- 递归判断:通过检查值的类型,确保不管对象嵌套多少层,都能遍历到最底层的原始值。
内容的提问来源于stack exchange,提问作者user1161137
相关产品推荐
相关产品推荐

