如何用Lodash扁平化嵌套对象数组并转换JSON对象(含CamelCase处理)
嘿,这两个Lodash的实用场景我经常碰到,给你详细拆解解决方案:
1. 扁平化嵌套的对象数组
假设你有带层级嵌套(比如包含children数组)的对象数组,像这样:
const nestedData = [ { id: 1, name: "Parent 1", children: [ { id: 2, name: "Child 1" }, { id: 3, name: "Child 2", children: [{ id: 4, name: "Grandchild 1" }] } ]}, { id: 5, name: "Parent 2" } ];
要把所有层级的对象平铺成一维数组,可以用Lodash的_.flatMapDeep——它能递归处理嵌套结构,帮你一次性扁平化:
const flattenedArray = _.flatMapDeep(nestedData, item => { // 如果当前项有子数组,就返回当前项(可选择移除children属性)+ 子数组 if (item.children) { return [_.omit(item, "children"), ...item.children]; } // 没有子数组的项直接返回 return item; });
如果你的嵌套是纯数组嵌套(比如[[1,2], [3,[4]]]),直接用_.flattenDeep(nestedArray)就搞定了,不用额外逻辑。
2. 将JSON对象转换为CamelCase格式
要把蛇形命名(user_id)、短横线命名(user-name)的键转换成驼峰式(userId),可以结合_.camelCase和递归遍历,处理嵌套的对象和数组:
先看原始的蛇形命名JSON:
const snakeCaseData = { user_id: 123, user_name: "John Doe", user_details: { email_address: "john@example.com", phone_number: "123-456-7890", address_info: { street_name: "Main St", zip_code: "10001" } }, order_history: [{ order_id: 1, order_date: "2024-01-01" }, { order_id: 2 }] };
写一个递归转换函数:
const toCamelCase = obj => { // 处理数组:遍历每个元素递归转换 if (_.isArray(obj)) { return obj.map(item => toCamelCase(item)); } // 处理对象:遍历键并转换为驼峰,值递归处理 if (_.isObject(obj)) { return _.transform(obj, (result, value, key) => { result[_.camelCase(key)] = toCamelCase(value); }, {}); } // 非对象/数组类型直接返回 return obj; }; const camelCaseData = toCamelCase(snakeCaseData);
如果只需要转换顶层键,不需要递归处理嵌套结构,用_.mapKeys更简单:
const topLevelCamelCase = _.mapKeys(snakeCaseData, (val, key) => _.camelCase(key));
内容的提问来源于stack exchange,提问作者Quang
相关产品推荐
相关产品推荐

