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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 18:30:06