如何从对象数组中仅提取值为true的键值对
问题描述
从API获取到如下对象数组,需要仅提取每个对象中值为true的键值对,最终用Object.keys()展示权限键。
数据示例:
[ { admin: false, createdAt: "2022-08-21T05:32:20.936Z", id: 8, read: false, write: true, }, ];
预期结果:
[{write:true}]
尝试的代码(未成功):
item.map(tab => { return Object.keys(tab).reduce((acc: string, key) => { if (tab[key]) { acc[key] = tab[key]; } return acc; }, {}); }),
解决方案
你代码的核心问题是reduce累加器acc的类型声明错误——你把它标注成了string,但实际上它应该是一个对象。修正类型后就能正常工作:
const filteredPermissions = item.map(tab => { return Object.keys(tab).reduce((acc: Record<string, boolean>, key) => { // 只保留布尔类型且值为true的键值对,避免误判非权限字段 const value = tab[key]; if (typeof value === 'boolean' && value) { acc[key] = value; } return acc; }, {}); });
补充说明
- 类型修正:将
acc: string改为acc: Record<string, boolean>(或直接acc: {},显式类型更严谨),确保累加器是对象类型,才能正确添加键值对。 - 字段过滤优化:加入
typeof value === 'boolean'判断,避免把id(非0数字)、createdAt(非空字符串)这类非布尔值字段误判为true,只筛选权限相关的布尔型字段。
执行后就能得到预期的[{write:true}]结果,后续可通过Object.keys(filteredPermissions[0])拿到权限键数组['write']。
内容的提问来源于stack exchange,提问作者callmeizaz
相关产品推荐
相关产品推荐

