如何高效过滤数据库返回JSON中以下划线开头的字段?
通用过滤下划线开头字段的方法
可以写一个递归遍历函数来自动过滤所有键名以下划线开头的字段,不管是顶层属性还是嵌套在多层对象里的,这样不用手动逐个删除,新增的私有字段也能自动处理。
实现通用过滤函数
这个函数会遍历对象的每一个属性:
- 如果属性名以
_开头,直接删除 - 如果属性值是对象(且不是
null),递归处理这个嵌套对象 - 如果属性值是数组,遍历数组里的每个元素,递归处理每个元素(如果是对象的话)
代码如下:
function filterPrivateFields(obj) { // 处理数组:遍历每个元素,递归过滤 if (Array.isArray(obj)) { return obj.map(item => filterPrivateFields(item)); } // 处理对象:遍历每个键 if (obj && typeof obj === 'object') { for (const key in obj) { // 删除下划线开头的键 if (key.startsWith('_')) { delete obj[key]; } else { // 递归处理嵌套对象 filterPrivateFields(obj[key]); } } } return obj; }
应用到你的代码中
把原来手动删除字段的部分替换成调用这个函数即可,修改后的完整代码:
// @see https://docs.aircode.io/guide/functions/ const {db} = require('aircode'); // 新增通用过滤函数 function filterPrivateFields(obj) { if (Array.isArray(obj)) { return obj.map(item => filterPrivateFields(item)); } if (obj && typeof obj === 'object') { for (const key in obj) { if (key.startsWith('_')) { delete obj[key]; } else { filterPrivateFields(obj[key]); } } } return obj; } module.exports = async function (params, context) { const table = db.table('persons'); if(!(await table.where().findOne())) { const students = []; for(let i = 0; i < 100; i++) { students.push({ name: `students${i}`, score: Math.floor(Math.random() * 100), info: {_private: 'something', public: {_foo: 'foo', bar: 'bar'}} }); } await table.save(students); } const result = await table.where({score: db.gt(60)}).limit(10).find(); // 调用过滤函数处理结果 const filteredResult = filterPrivateFields(result); return { result: filteredResult, }; };
为什么这个方法更好?
- 通用性强:不管新增多少个下划线开头的字段,不管嵌套多少层,都能自动过滤,不用修改代码
- 可复用:这个函数可以抽出来放到工具文件里,整个项目的类似需求都能用
- 效率更高:一次遍历处理所有情况,不用手动写多个
delete语句
内容的提问来源于stack exchange,提问作者user18343489
相关产品推荐
相关产品推荐

