在Web开发中,经常需要对JSON对象进行处理。在处理过程中,检查一个JSON对象是否包含某个key是一项基本的技能。本文将从多个方面详细介绍如何使用JavaScript判断JSON对象是否包含某个Key。
一、通过in
、hasOwnProperty
和undefined
来判断key是否存在
//判断key是否存在
function hasKey(json, key) {
return key in json || json.hasOwnProperty(key) || typeof(json[key]) !== "undefined";
}
使用JavaScript中的in
、hasOwnProperty
和undefined
来判断JSON对象中是否存在key,这是最常见的判断方法。in
判断方法可以判断JSON对象以及原型链中是否存在key。hasOwnProperty
方法只判断当前对象中是否存在key。typeof
方法判断当前对象中是否存在key的值,无论值为何种数据类型。
但是,使用in
方法判断某个JSON对象的key时有一个注意点,就是需要使用hasOwnProperty
方法判断obj是否继承其原型链中的属性和方法。例如:
var obj = { a: 1, b: 2 };
Object.prototype.c = 3;
console.log('a' in obj); // true
console.log('b' in obj); // true
console.log('c' in obj); // true
console.log(obj.hasOwnProperty('a')); // true
console.log(obj.hasOwnProperty('b')); // true
console.log(obj.hasOwnProperty('c')); // false
从这个例子中可以看到,在使用in
进行判断时,会沿着对象原型链继续寻找属性。因此,可以看到c
这个属性并不属于obj
,而是继承来自其原型链。这时候使用hasOwnProperty
就能准确判断obj
中究竟是否含有这个属性。
二、通过Object.keys
方法来判断json包含的所有key
//判断key是否存在
function hasKeys(json, keys) {
return keys.every(key => Object.keys(json).includes(key));
}
Object.keys
方法返回JSON对象中所有自己的key列表。因此,只需要通过Object.keys
方法获取json中所有的key列表,再使用includes
方法判断列表中是否包含需要判断的key即可。
三、通过JSON Schema来判断json是否包含某个key
//判断key是否存在
function validate(json, schema) {
const validator = ajv.compile(schema); // 使用ajv模块进行JSON Schema验证
return validator(json);
}
const schema = {
type: 'object',
properties: {
name: { type: "string" },
age: { type: "number" },
},
required: ["name", "age"],
};
console.log(validate({name: 'Tom', age: 18}, schema)); // true
console.log(validate({name: 'Tom'}, schema)); // false
JSON schema是对JSON对象结构的一种描述语言,可以对JSON对象进行格式验证。使用JSON schema,可以详细描述JSON对象的key类型和必要性。可以使用第三方库如ajv来进行JSON schema的验证。通过这种方法,可以在保证代码不臃肿的同时,极大地提高代码健壮性以及操作完成的准确程度。
四、通过lodash的get
方法判断json是否包含某个深层次的key
function hasDeepKey(obj, key) {
if (_.isObject(obj)) {
if (_.has(obj, key)) { // 如果对象包含该属性,则直接返回true
return true;
}
//否则遍历对象的值,查找是否包含该属性
for (let k in obj) {
if (hasDeepKey(_.get(obj, k), key)) {
return true;
}
}
}
return false;
}
使用这种方法不仅能检查对象是否包含某个key,同时还能够检查对象中嵌套的属性是否包含某个key。这种方法使用了lodash库中的isObject
、has
、get
等方法。
五、通过try catch语句块try访问key,若发生错误则说明key不存在
function tryAccessKey(json, key) {
try {
const value = json[key];
return typeof value !== "undefined";
}
catch {
return false;
}
}
这种方法通过try catch
语句块来捕获错误,来判断json中是否含有某个属性。如果访问key时成功,则说明json对象,而如果发生错误则说明json对象中不包含该属性。
结论
在处理JSON对象时,判断一个JSON对象是否含有某个属性是一项基本技能。通过本文所述的五种方法,可以灵活运用各种方法判断JSON对象的Key是否存在。