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

如何用Lodash在TypeScript中高效处理复杂嵌套数据转换?

使用Lodash高效处理嵌套JSON的扁平化与结构转换

一、更高效的Lodash实现方式

你当前的代码分两步处理数据,其实可以合并流程、减少遍历次数,提升执行效率:

1. 一步完成结构转换(跳过中间扁平化数组)

如果最终目标是生成以postalCode为键的对象,可以直接遍历原始用户数组,用_.transform一步构建结果,避免生成中间的扁平化数组:

import _ from 'lodash';

const transformedData = _.transform(nestedData.users, (result, user) => {
  // 解构提取所需属性,避免深层嵌套访问
  const { name } = user;
  const { age } = user.details;
  const { city, postalCode } = user.details.address;
  
  result[postalCode] = { name, age, city };
}, {} as Record<string, { name: string; age: number; city: string }>);

这种方式只遍历一次用户数组,比原代码的三次遍历(flatMap → keyBy → mapValues)更高效,同时减少内存占用。

2. 通用的扁平化方法(如果需要保留扁平化数组)

如果必须生成扁平化数组,不用手动逐个提取属性,可以用递归式的扁平化函数,适配更复杂的嵌套结构:

// 通用对象扁平化函数
const flattenObject = (obj: Record<string, any>): Record<string, any> => {
  return _.transform(obj, (result, value, key) => {
    if (_.isPlainObject(value)) {
      // 递归扁平化子对象并合并到结果
      Object.assign(result, flattenObject(value));
    } else {
      result[key] = value;
    }
  }, {});
};

// 生成扁平化用户数组
const flattenedData = nestedData.users.map(flattenObject);

这个函数会自动处理任意深度的嵌套对象,后续结构变化时无需修改提取逻辑。

二、提升代码可读性与可维护性的方案

1. 用TypeScript接口定义数据结构

明确的类型定义能提供代码提示、避免类型错误,同时让数据结构一目了然:

// 原始嵌套数据类型
interface Address {
  city: string;
  postalCode: string;
}

interface UserDetails {
  age: number;
  address: Address;
}

interface OriginalUser {
  id: number;
  name: string;
  details: UserDetails;
}

// 扁平化后的数据类型
interface FlattenedUser {
  id: number;
  name: string;
  age: number;
  city: string;
  postalCode: string;
}

// 最终转换结果类型
interface TransformedResult {
  [postalCode: string]: {
    name: string;
    age: number;
    city: string;
  };
}

2. 拆分纯函数,单一职责

把扁平化、转换逻辑拆成独立的纯函数,每个函数只做一件事,便于测试和复用:

// 单个用户的扁平化处理
const flattenUser = (user: OriginalUser): FlattenedUser => ({
  id: user.id,
  name: user.name,
  age: user.details.age,
  city: user.details.address.city,
  postalCode: user.details.address.postalCode
});

// 转换为postalCode映射
const toPostalCodeMap = (users: FlattenedUser[]): TransformedResult => 
  _.mapValues(_.keyBy(users, 'postalCode'), ({ name, age, city }) => ({ name, age, city }));

// 使用示例
const flattenedData = nestedData.users.map(flattenUser);
const transformedData = toPostalCodeMap(flattenedData);

3. 安全访问嵌套属性

用_.get处理可能存在的属性缺失问题,避免运行时报错:

const flattenUser = (user: OriginalUser): FlattenedUser => ({
  id: _.get(user, 'id', 0),
  name: _.get(user, 'name', ''),
  age: _.get(user, 'details.age', 0),
  city: _.get(user, 'details.address.city', ''),
  postalCode: _.get(user, 'details.address.postalCode', '')
});

4. 添加简洁注释

只在关键逻辑处添加注释,说明“为什么这么做”而非“做了什么”:

// 用默认值兜底,避免嵌套属性缺失导致运行时报错
const flattenUser = (user: OriginalUser): FlattenedUser => ({
  id: _.get(user, 'id', 0),
  name: _.get(user, 'name', ''),
  age: _.get(user, 'details.age', 0),
  city: _.get(user, 'details.address.city', ''),
  postalCode: _.get(user, 'details.address.postalCode', '')
});

内容的提问来源于stack exchange,提问作者Ilker Ozturk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 20:13:14