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

JavaScript:如何区分多键值对对象与字符串值对象以扁平化对象

递归扁平化对象并区分对象与字符串类型

要解决这个问题,核心是准确判断一个值是否是普通的键值对对象,而非字符串、数组或其他内置对象。之前用Object.keys()的问题在于,字符串在被强制转为对象时会被当作类数组结构处理,所以需要更精准的类型判断逻辑。

如何区分普通对象与其他类型

可以通过以下条件组合判断一个值是否为普通对象:

  • 排除null(因为typeof null会返回'object')
  • typeof 值为'object'
  • 不是数组(Array.isArray()返回false)
  • 构造函数为Object(确保不是Date、RegExp这类内置对象)

对应的工具函数可以这么写:

function isPlainObject(value) {
  return value !== null 
    && typeof value === 'object' 
    && !Array.isArray(value) 
    && value.constructor === Object;
}

递归扁平化对象的实现

基于上面的判断函数,我们可以写一个递归函数来扁平化对象:

function flattenObject(obj) {
  const result = {};
  
  // 遍历当前对象的所有键
  for (const key of Object.keys(obj)) {
    const value = obj[key];
    
    // 如果值是普通对象,递归扁平化后合并到结果
    if (isPlainObject(value)) {
      Object.assign(result, flattenObject(value));
    } else {
      // 非对象值直接添加到顶层
      result[key] = value;
    }
  }
  
  return result;
}

测试示例

用你提供的obj1测试:

const obj1 = { name: "Goggles", price: 1499, obj: {no: "hi", yes: "bye"} };
const flattened = flattenObject(obj1);
console.log(flattened);
// 输出:{ name: "Goggles", price: 1499, no: "hi", yes: "bye" }

这个逻辑会正确跳过字符串、数字等类型,只递归处理真正的键值对对象,避免把字符串拆成字符数组的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 20:50:29