如何使用lodash的toPairs递归扁平化嵌套对象为目标数组
你给出的期望输出存在笔误:alice对应的pizza和milkshake的数值和原对象不一致,正确的输出应该保留原对象的数值10和2。
方案1:固定两层嵌套的原生JS实现
你给出的结构是固定两层的嵌套对象,不需要递归,直接两层遍历即可:
let order = { "john": { "hamburger": 4 }, "alice": { "pizza": 10, "milkshake": 2 }, "bob": {} } const res = [] // 遍历第一层的用户和对应的点餐对象 for (const [user, foodMap] of Object.entries(order)) { // 遍历第二层的餐品和数量 for (const [foodName, count] of Object.entries(foodMap)) { res.push([user, foodName, count]) } }
输出结果:
[ ["john", "hamburger", 4], ["alice", "pizza", 10], ["alice", "milkshake", 2] ]
方案2:使用Lodash的toPairs实现
你提到的toPairs方法和原生Object.entries功能一致,结合flatMap可以更简洁的实现:
const _ = require('lodash') const res = _.flatMap(_.toPairs(order), ([user, foodMap]) => _.toPairs(foodMap).map(([foodName, count]) => [user, foodName, count]) )
方案3:任意深度嵌套的通用递归实现
如果你的实际场景是嵌套层数不固定的对象,可以用下面的递归方法适配所有深度的展开:
function flattenNestedObject(obj, parentKeys = []) { const result = [] for (const [key, value] of Object.entries(obj)) { // 判断当前值是否为纯对象,是的话继续递归 if (Object.prototype.toString.call(value) === '[object Object]') { result.push(...flattenNestedObject(value, [...parentKeys, key])) } else { // 基础值直接拼接路径和值放入结果 result.push([...parentKeys, key, value]) } } return result } const res = flattenNestedObject(order)
内容的提问来源于stack exchange,提问作者user2741831
相关产品推荐
相关产品推荐

