You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 08:45:01