JavaScript如何编写校验对象指定父节点下是否存在对应子键的函数
功能实现需求
现有如下JavaScript对象:
let obj = { "type": "user", "personalDetails": { "firstName": "Steven", "address": { "streetName": "abcd", "zipCode": "012345" } }, "employeeDetails": { "designation": { "id": "1234", "manage": "Mark", } } }
需要实现一个动态校验函数,接收三个入参:
- 第一个参数为待校验的JS对象
- 第二个参数为父节点名称(字符串格式)
- 第三个参数为子节点名称(字符串格式)
如果子节点存在于指定父节点下则返回true,否则返回false。
代码实现
const childNodeExist = (obj, parentKey, childKey) => { // 先校验父节点存在,且父节点的值为非空对象(可持有子属性) if (Object.prototype.hasOwnProperty.call(obj, parentKey) && typeof obj[parentKey] === 'object' && obj[parentKey] !== null) { return Object.prototype.hasOwnProperty.call(obj[parentKey], childKey) } return false }
说明:这里用
Object.prototype.hasOwnProperty.call是为了避免对象重写hasOwnProperty方法导致的判断异常,如果你可以确保操作的对象没有重写该方法,也可以直接简化为obj.hasOwnProperty(parentKey)的写法。如果需要包含对象继承的属性作为判定范围,也可以将判断逻辑替换为parentKey in obj和childKey in obj[parentKey]。
调用示例
注意调用时父节点、子节点名称需要传入字符串格式,否则会抛出变量未定义的错误:
// 返回true,firstName存在于personalDetails下 console.log(childNodeExist(obj, 'personalDetails', 'firstName')) // 返回true,designation存在于employeeDetails下 console.log(childNodeExist(obj, 'employeeDetails', 'designation')) // 返回false,salary不存在于employeeDetails下 console.log(childNodeExist(obj, 'employeeDetails', 'salary'))
内容的提问来源于stack exchange,提问作者user2281858
相关产品推荐
相关产品推荐

