在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是否存在。