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

2024-09-27 22:31:42 发布

您现在位置:Python中文网/ 问答频道 /正文

原始对象:[ { 名称:“ZoneName”, 值:“框A”, } , { 名称:'空侧', 价值:{ JZCleanTipFlowResults:{ 泄漏空气流量:2.0519336991674058, 泄漏空气流量不确定度:0.05755421849942835, 泄漏空气流量_lbmhr:16285.188088630204, 泄漏空气流量不确定度:456.779511900225, }, 使用Dambient TemperatureForCombition:正确, SubStoichWarning:错误, }, } , { 名称:'FuelSide', 价值:{ 燃料:{ “标题0”:{ 清洁压力:{ 人力资源:10776333.422366736, HR_不确定性:14383.420657232984, 人力资源部:36.77037592294784, }, }, }, 清洁压力:{ 人力资源:10776333.422366736, HR_不确定性:14383.420657232984, }, }, }, ];

想要像这样的对象:

无齿形状:[ { 名称:“ZoneName”, 值:“框A”, } , { 名称:“空侧| JZCleanTipFlowResults |泄漏空气流速”, 价值:2.0519336991674058, } , { 名称:“空侧| JZCleanTipFlowResults |泄漏气流率|不确定性”, 数值:0.05755421849942835, } , { 名称:“空侧| JZCleanTipFlowResults |泄漏空气流量| lbmhr”, 数值:16285.188088630204, } , { 名称:“空侧| JZCleanTipFlowResults |泄漏空气流速_lbmhr _不确定性”, 价值:456.779511900225, } , { 名称:“空侧|燃烧时使用的空气温度”, 价值观:正确, } , { 名称:“空侧| JZCleanTipFlowResults | SubStoichWarning”, 值:false, } , { 名称:'FuelSide | Fuels |收割台0 | CleanTipResults | HR', 数值:10776333.422366736, } , { 名称:'FuelSide | Fuels | Header 0 | CleanTipResults | HR |不确定性', 数值:14383.420657232984, } , { 名称:'FuelSide | Fuels | Header 0 | CleanTipResults | HR | MMBTUhr', 价值:36.77037592294784, } , { 名称:'FuelSide | CleanTipResults | HR', 数值:10776333.422366736, } , { 名称:'FuelSide | CleanTipResults | HR | U不确定性', 数值:14383.420657232984, } ]


Tags: 对象名称hr流量数值空气价值不确定性
2条回答

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

我从我以前的答案中窃取了帮助函数path获取一个节点名数组和一个对象,并返回对象中该路径的值,或者undefined如果任何节点不存在。例如,path (['foo', 'bar', 'baz'])应用于{foo: {bar: {baz: 42}, qux: 99}, corge: -1}产生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/Value pairs. These are joined into a single list with flatMap数组

&13; 第13部分,;
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))
.as-console-wrapper {min-height: 100% !important; top: 0}
和#13;
和#13;

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

  1. 如果输入是一个对象
  2. “压扁”它
  3. 否则,输入不是对象。返回“平坦”结果

&13; 第13部分,;
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))
和#13;
和#13;

输出-

[
  {
    "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
  }
]

相关问题 更多 >

    热门问题