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

