如何检测JavaScript对象中是否存在与数组元素匹配的键?
问题描述
给定以下数组和对象:
array = ['data', 'category', 'hour']; object = { "status": { "type": "INFO", "messages": [] }, "data": { "id": 1, "tenant": "675832", "process": "6911d872-35f8-11ea-8697-001dd8b71c20", "category": "resquests", "time": { hour: "12", minute: "30" } } }
需求是检查object中是否存在键与array里的元素值一致。此前尝试通过点分割数组并过滤的方式未成功,尝试的代码如下:
const array = inputValue.split('.').map((item) => item);
解决方案
场景1:检查数组元素是否为对象任意层级的键
因为目标键可能存在于嵌套对象中(比如hour在data.time下),可以通过递归遍历对象所有层级的键,再与数组元素比对:
// 递归获取对象所有层级的键 function getAllKeys(obj) { let keys = []; for (const key in obj) { keys.push(key); if (typeof obj[key] === 'object' && obj[key] !== null) { keys = keys.concat(getAllKeys(obj[key])); } } return keys; } // 检查是否存在至少一个匹配的键 const hasMatchedKey = array.some(key => getAllKeys(object).includes(key)); console.log(hasMatchedKey); // 输出true,因为三个元素都在对象键中存在 // 若需要找出所有匹配的键 const matchedKeys = array.filter(key => getAllKeys(object).includes(key)); console.log(matchedKeys); // 输出['data', 'category', 'hour']
场景2:检查指定嵌套路径是否存在(对应你尝试的点分割逻辑)
如果你的inputValue是类似"data.time.hour"的路径字符串,之前的代码仅完成了分割,未校验路径有效性,可以用以下方法检查路径是否存在于对象中:
function checkPathValid(obj, pathArray) { let current = obj; for (const key of pathArray) { if (!current || !(key in current)) { return false; } current = current[key]; } return true; } // 示例:校验"data.time.hour"路径 const inputValue = "data.time.hour"; const pathArray = inputValue.split('.'); console.log(checkPathValid(object, pathArray)); // 输出true
内容的提问来源于stack exchange,提问作者André Castro
相关产品推荐
相关产品推荐

