首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用递归函数将对象转换为特定格式

使用递归函数将对象转换为特定格式
EN

Stack Overflow用户
提问于 2020-04-17 15:48:18
回答 2查看 93关注 0票数 0

原始对象:{ Name:'ZoneName',Value:'Box A',},{ Name:'AirSide',Value:{ JZCleanTipFlowResults:{ LeakageAirFlowRate: 2.0519336991674058,LeakageAirFlowRate_Uncertainty: 0.05755421849942835,LeakageAirFlowRate_lbmhr: 16285.188088630204,LeakageAirFlowRate_lbmhr_Uncertainty: 456.779511900225,},UsedAmbientTemperatureForCombustion: true,SubStoichWarning: false,},},{ Name:'FuelSide',取值:{ Fuels:{ 'Header 0':{ CleanTipResults:{ HR: 10776333.422366736,HR_Uncertainty: 14383.420657232984,HR_MMBTUhr: 36.77037592294784,},},},CleanTipResults:{ HR: 10776333.422366736,HR_Uncertainty: 14383.420657232984,},

想要像这样的对象:

命名形状:{名称:‘'AirSide|JZCleanTipFlowResults|LeakageAirFlowRate_Uncertainty',名称’,值:'Box A',},{名称:'AirSide|JZCleanTipFlowResults|LeakageAirFlowRate',值: 2.0519336991674058,},{名称:‘AirSide|JZCleanTipFlowResults|LeakageAirFlowRate_Uncertainty’,值: 0.05755421849942835,},{名称:'AirSide|JZCleanTipFlowResults|LeakageAirFlowRate_lbmhr',值: 16285.188088630204,},{名称:'AirSide|JZCleanTipFlowResults|LeakageAirFlowRate_lbmhr_Uncertainty',值: 456.779511900225,},{名称:'AirSide|UsedAmbientTemperatureForCombustion',值: true,},{名称:'AirSide|JZCleanTipFlowResults|SubStoichWarning',值: false,},{ Name:'FuelSide|Fuels|Header 0|CleanTipResults|HR',值: 10776333.422366736,},{ Name:'FuelSide|Fuels|Header 0|CleanTipResults|HR_不确定性‘,值: 14383.420657232984,},{ Name:'FuelSide|Fuels|Header 0|CleanTipResults|HR_MMBTUhr',值: 36.77037592294784,},{ Name:'FuelSide|CleanTipResults|HR',值: 10776333.422366736,},{名称:‘FuelSide|CleanTipResults|HR_不确定性’,值: 14383.420657232984,}

EN

回答 2

Stack Overflow用户

发布于 2020-04-18 00:36:59

我将提供我的想法,因为这里已经有了一个高质量的答案。但请注意,在未来,StackOverflow是用来在您遇到困难时帮助您的,而不是为您编写代码。请展示你自己的努力,并解释你被困在哪里。

我从我之前的答案中窃取了助手函数。path接受一个节点名称数组和一个对象,并返回对象中该路径处的值,如果任何节点不存在,则返回undefined。例如,应用于{foo: {bar: {baz: 42}, qux: 99}, corge: -1}path (['foo', 'bar', 'baz'])会产生42

getPaths是一个生成器函数,它为您提供指向对象叶节点的路径。因此,getPaths ({foo: {bar: {baz: 42}, qux: 99}, corge: -1})生成["foo", "bar", "baz"],然后是["foo", "qux"]["corge"]

定制的transform函数遍历Name/Value对的数组,如果Value是字符串,则返回它们,否则使用getPaths将值转换为Condensed|Path|Names /值对的数组。使用flatMap将这些连接到单个列表中。

代码语言:javascript
复制
const path = (ps = [], obj = {}) =>
  ps .reduce ((o, p) => (o || {}) [p], obj)

function * getPaths(o, p = []) {
  if (Object(o) !== o || Object .keys (o) .length == 0) yield p 
  if (Object(o) === o)
    for (let k of Object .keys (o))
      yield * getPaths (o[k], [...p, Number.isInteger (Number (k)) ? Number (k) : k])
}

const transform = (orig) => 
  orig .flatMap (({Name, Value}) => 
    typeof Value == 'string' 
      ? {Name, Value}
      : [... getPaths (Value)] .map (
          route => ({Name: Name + '|' + route .join ('|'), Value: path (route, Value)})
        )
  )

const orig = [{Name: "ZoneName", Value: "Box A"}, {Name: "AirSide", Value: {JZCleanTipFlowResults: {LeakageAirFlowRate: 2.0519336991674058, LeakageAirFlowRate_Uncertainty: .05755421849942835, LeakageAirFlowRate_lbmhr: 16285.188088630204, LeakageAirFlowRate_lbmhr_Uncertainty: 456.779511900225}, UsedAmbientTemperatureForCombustion: true, SubStoichWarning: false}}, {Name: "FuelSide", Value: {Fuels: {"Header 0": {CleanTipResults: {HR: 10776333.422366736, HR_Uncertainty: 14383.420657232984, HR_MMBTUhr: 36.77037592294784}}}, CleanTipResults: {HR: 10776333.422366736, HR_Uncertainty: 14383.420657232984}}}];

console .log (transform (orig))
代码语言:javascript
复制
.as-console-wrapper {min-height: 100% !important; top: 0}

票数 1
EN

Stack Overflow用户

发布于 2020-04-18 04:45:59

如果你只是在寻找一个复制/粘贴的答案,我不会费心提供太多的解释。但我不介意完成拼图和分享我的作品-

  1. 如果输入是对象,则
  2. 将其“展平”。
  3. 否则,输入不是对象。返回“扁平”结果。

代码语言:javascript
复制
const transform = (o = {}, path = []) =>
  Object(o) === o   // 1
    ? Object        // 2
        .entries(o)
        .flatMap(([ k, v ]) => transform(v, [...path, k]))
    : [ { path: path.join("|"), value: o } ] // 3

const data =
  [{Name:'ZoneName',Value:'Box A'},{Name:'AirSide',Value:{JZCleanTipFlowResults:{LeakageAirFlowRate:2.0519336991674058,LeakageAirFlowRate_Uncertainty:0.05755421849942835,LeakageAirFlowRate_lbmhr:16285.188088630204,LeakageAirFlowRate_lbmhr_Uncertainty:456.779511900225},UsedAmbientTemperatureForCombustion:true,SubStoichWarning:false}},{Name:'FuelSide',Value:{Fuels:{'Header 0':{CleanTipResults:{HR:10776333.422366736,HR_Uncertainty:14383.420657232984,HR_MMBTUhr:36.77037592294784}}},CleanTipResults:{HR:10776333.422366736,HR_Uncertainty:14383.420657232984}}}]

const result =
  transform(data)

console.log(JSON.stringify(result, null, 2))

输出-

代码语言:javascript
复制
[
  {
    "path": "0|Name",
    "value": "ZoneName"
  },
  {
    "path": "0|Value",
    "value": "Box A"
  },
  {
    "path": "1|Name",
    "value": "AirSide"
  },
  {
    "path": "1|Value|JZCleanTipFlowResults|LeakageAirFlowRate",
    "value": 2.0519336991674058
  },
  {
    "path": "1|Value|JZCleanTipFlowResults|LeakageAirFlowRate_Uncertainty",
    "value": 0.05755421849942835
  },
  {
    "path": "1|Value|JZCleanTipFlowResults|LeakageAirFlowRate_lbmhr",
    "value": 16285.188088630204
  },
  {
    "path": "1|Value|JZCleanTipFlowResults|LeakageAirFlowRate_lbmhr_Uncertainty",
    "value": 456.779511900225
  },
  {
    "path": "1|Value|UsedAmbientTemperatureForCombustion",
    "value": true
  },
  {
    "path": "1|Value|SubStoichWarning",
    "value": false
  },
  {
    "path": "2|Name",
    "value": "FuelSide"
  },
  {
    "path": "2|Value|Fuels|Header 0|CleanTipResults|HR",
    "value": 10776333.422366736
  },
  {
    "path": "2|Value|Fuels|Header 0|CleanTipResults|HR_Uncertainty",
    "value": 14383.420657232984
  },
  {
    "path": "2|Value|Fuels|Header 0|CleanTipResults|HR_MMBTUhr",
    "value": 36.77037592294784
  },
  {
    "path": "2|Value|CleanTipResults|HR",
    "value": 10776333.422366736
  },
  {
    "path": "2|Value|CleanTipResults|HR_Uncertainty",
    "value": 14383.420657232984
  }
]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61266520

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档