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

如何获取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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:00:40