TypeScript如何基于点表示法路径对对象数组做动态字段投影
实现方案
你可以通过自定义投影函数的方式完成动态字段筛选,原生JS实现无需引入第三方依赖,代码如下:
1. 核心投影函数实现
/** * 根据点路径数组从原对象提取指定字段生成新对象 * @param {Object} obj 原对象 * @param {string[]} paths 点路径数组 * @returns {Object} 投影后的新对象 */ function projectByPaths(obj, paths) { const result = {}; paths.forEach(path => { const pathSegments = path.split('.'); let sourceCursor = obj; let targetCursor = result; // 逐层创建嵌套结构,处理到倒数第二层 for (let i = 0; i < pathSegments.length - 1; i++) { const seg = pathSegments[i]; if (!sourceCursor?.[seg]) return; // 原路径不存在直接跳过当前路径 if (!targetCursor[seg]) targetCursor[seg] = {}; targetCursor = targetCursor[seg]; sourceCursor = sourceCursor[seg]; } // 给最后一层属性赋值 const lastSeg = pathSegments.at(-1); targetCursor[lastSeg] = sourceCursor[lastSeg]; }); return result; }
2. 调用方式
直接在Array.map中传入该函数即可:
const projectedPeople = people.map(person => projectByPaths(person, paths));
最终得到的projectedPeople就是你期望的仅包含选中字段的对象数组,直接调用JSON.stringify(projectedPeople)即可完成序列化。
可选简化方案(项目已引入Lodash时使用)
如果你的项目已经引入Lodash,可以直接利用_.get和_.set简化实现:
import { get, set } from 'lodash'; const projectedPeople = people.map(person => { const res = {}; paths.forEach(path => set(res, path, get(person, path))); return res; });
内容的提问来源于stack exchange,提问作者Mike Rowley
相关产品推荐
相关产品推荐

