如何检测数组中是否有元素匹配对象的任意顶级键
检测数组元素是否匹配对象的顶级键
问题场景
现有对象arr1和数组arr2,需要判断arr2中是否存在任意元素匹配arr1的顶级键(forms或assets):
const arr1 = { forms: { permissions: { create: true, edit: true, delete: true, }, }, assets: { permissions: { create: true, edit: true, delete: true, }, }, }; const arr2 = ["assets", "media"];
原尝试的代码仅在arr2为单个元素时生效,无法处理数组场景:
if (arr2 in arr1) { console.log("key is in contained in object"); }
解决方案
方法1:使用some()配合hasOwnProperty()
通过数组的some()方法遍历arr2,逐个检查元素是否是arr1的自有顶级键:
if (arr2.some(key => arr1.hasOwnProperty(key))) { console.log("存在匹配的顶级键"); }
some()会在找到第一个满足条件的元素时立即返回true,无需遍历全部元素,性能更优hasOwnProperty()确保只检查对象自身的属性,不会包含原型链上的属性
方法2:先获取对象键数组再匹配
先通过Object.keys()提取arr1的所有顶级键,再检查arr2中是否有元素存在于该数组中:
const arr1TopKeys = Object.keys(arr1); if (arr2.some(key => arr1TopKeys.includes(key))) { console.log("存在匹配的顶级键"); }
原代码问题说明
arr2 in arr1是错误用法:in操作符的左操作数必须是字符串类型的属性名,而不是数组。当arr2是单个字符串时,表达式会检查该字符串是否是arr1的属性;但arr2为数组时,实际是在检查arr1是否存在名为数组字符串形式(如"["assets","media"]")的属性,显然不符合需求。
内容的提问来源于stack exchange,提问作者flinch85
相关产品推荐
相关产品推荐

