如何从对象数组的每个对象中仅提取属性值(Node.js+Knex.js场景)
解决方案
方案1:使用Knex内置pluck方法(最优,单行实现)
直接在查询链末尾添加.pluck('目标字段名'),Knex会直接返回仅包含该字段值的一维数组,无需额外处理:
const vrnList = await db('vehicles').select('vrn').where('id', '=', '1').pluck('vrn'); // 输出示例:['xx12xyz']
如果是按唯一ID查询、确定仅返回单条数据,可以搭配.first()直接拿到单个值:
const vrn = await db('vehicles').where('id', '=', '1').pluck('vrn').first(); // 输出示例:'xx12xyz'
方案2:原生JS手动提取(通用场景,不依赖Knex特性)
用数组的map方法遍历提取指定字段,适用于任意对象数组的字段提取场景:
const vrnList = (await db('vehicles').select('vrn').where('id', '=', '1')).map(item => item.vrn);
通用辅助函数封装
如果需要频繁做这类字段提取,可以封装简单的工具函数复用:
// 入参:对象数组、要提取的字段名,返回值:一维字段值数组 const extractField = (objArr, field) => objArr.map(item => item[field]); // 使用示例 const rawRes = await db('vehicles').select('vrn').where('id', '=', '1'); const vrnList = extractField(rawRes, 'vrn');
补充说明
你之前使用Object.values不生效的原因是:Object.values的作用是提取单个对象的所有属性值为数组,你传入的参数是外层的查询结果数组,因此返回的还是包含对象的数组,无法提取到对象内部的vrn属性值。
内容的提问来源于stack exchange,提问作者JPA
相关产品推荐
相关产品推荐

