如何用map函数结合扩展运算符从变量数组提取指定对象字段?
动态提取对象指定字段生成新数组的优雅实现
方法一:使用 reduce 构建新对象
这是兼容性较好的基础实现方式:
const newReport = report.map(item => fields.reduce((newObj, key) => { newObj[key] = item[key]; return newObj; }, {}) );
遍历原数组的每个对象,通过reduce将fields数组中指定的字段逐一从原对象中取出,存入空对象并返回,最终组成目标数组。
方法二:使用 Object.fromEntries 简化代码
如果运行环境支持ES2019及以上,可以用更简洁的写法:
const newReport = report.map(item => Object.fromEntries(fields.map(key => [key, item[key]])) );
先把fields数组转换成[键名, 对应值]的二维数组,再通过Object.fromEntries直接转成目标对象,代码更紧凑直观。
方法三:封装成通用复用函数
如果需要多次使用这个逻辑,可以封装成函数提升复用性:
function pickFields(sourceArray, targetFields) { return sourceArray.map(item => Object.fromEntries(targetFields.map(key => [key, item[key]])) ); } // 调用示例 const newReport = pickFields(report, fields);
后续需要提取不同字段时,直接传参调用函数即可,无需重复编写逻辑。
为什么你之前的写法不生效
你尝试的({ ...fields })是错误用法:对象解构需要明确指定要提取的键名,而fields是数组,扩展运算符...无法将数组元素映射为对象的键,因此达不到预期效果。
内容的提问来源于stack exchange,提问作者hc48
相关产品推荐
相关产品推荐

