如何在JavaScript中检查对象仅含指定1个或2个属性
检查对象是否仅包含指定属性的几种方法
嘿,这个问题我碰到过好多次了,给你几个实用的方案,按需选用就行:
一、检查对象仅包含单个指定属性(比如仅含a)
最简单的方式是利用Object.keys()获取对象的可枚举属性数组,然后判断数组长度为1且唯一的属性键是目标键:
const obj1 = { a: 'something' }; // 检查仅含属性a const hasOnlyPropA = Object.keys(obj1).length === 1 && Object.keys(obj1)[0] === 'a'; console.log(hasOnlyPropA); // 输出 true
如果你的对象可能存在不可枚举属性,那就要用Object.getOwnPropertyNames()来获取所有自身属性(包括不可枚举的,除了Symbol属性):
// 假设有一个带不可枚举属性的对象 const objWithNonEnum = { a: 'something' }; Object.defineProperty(objWithNonEnum, 'hidden', { value: 'secret', enumerable: false }); const hasOnlyPropAIncludingNonEnum = Object.getOwnPropertyNames(objWithNonEnum).length === 1 && Object.getOwnPropertyNames(objWithNonEnum)[0] === 'a'; console.log(hasOnlyPropAIncludingNonEnum); // 输出 false,因为存在不可枚举的hidden属性
二、检查对象仅包含两个指定属性(比如仅含a和b)
先从可枚举属性的场景入手,我们可以先定义允许的属性列表,然后验证对象的属性长度和列表长度一致,且所有属性都在允许列表内:
const obj2 = { a: 'something', b: 'something else' }; const allowedProps = ['a', 'b']; const hasOnlyAAndB = Object.keys(obj2).length === allowedProps.length && Object.keys(obj2).every(key => allowedProps.includes(key)); console.log(hasOnlyAAndB); // 输出 true
如果允许的属性较多,用Set可以优化查找速度:
const objKeys = new Set(Object.keys(obj2)); const allowedSet = new Set(allowedProps); const hasOnlyAAndBWithSet = objKeys.size === allowedSet.size && [...objKeys].every(key => allowedSet.has(key));
额外场景:包含Symbol类型属性的检查
如果对象用到了Symbol类型的属性,就要用Reflect.ownKeys(),它能返回所有自身属性(包括字符串键、Symbol键,以及不可枚举属性):
const symProp = Symbol('unique'); const objWithSym = { a: 'test', [symProp]: 'symbol value' }; const allowedPropsWithSym = ['a', symProp]; const hasOnlyAAndSym = Reflect.ownKeys(objWithSym).length === allowedPropsWithSym.length && Reflect.ownKeys(objWithSym).every(key => allowedPropsWithSym.includes(key)); console.log(hasOnlyAAndSym); // 输出 true
内容的提问来源于stack exchange,提问作者Pranta
相关产品推荐
相关产品推荐

