Преобразовать объект в указанный c формат с помощью рекурсивной функции - PullRequest
0 голосов
/ 17 апреля 2020

исходный объект: [{Name: «ZoneName», значение: «Box A»,}, {Name: «AirSide», значение: {JZCleanTipFlowResults: {LeakageAirFlowRate: 2.0519336991674058, LeakageAirFlowRate_Unturesty: LeakageAirFlowRate_Un про 456.779511900225,}, UsedAmbientTe TemperatureForComburation: true, SubStoichWarning: false,},}, {Name: 'FuelSide', значение: {Fuels: {'Header 0': {CleanTipResults: {HR: 10776333.422366736, HR_Unturesty: 1422768686) },},}, CleanTipResults: {HR: 10776333.422366736, HR_Unterminty: 14383.420657232984,},},},];

Требуется объект типа:

денестированная форма: [{Name: 'ZoneName ', Значение:' Box A ',}, {Имя:' AirSide | JZCleanTipFlowResults | LeakageAirFlowRate ', Значение: 2.0519336991674058,}, {Имя:' AirSide | JZCleanTipFlowResults | LeakageAirFlowRateRate_0755}, 021, 285, 021, 0, 28, 0, 28, 0, 28, 0, 0, 28, 0, 28, 0, 28, 0, 28, 0, 28, 0, 28, 0, 28, 0, 28, 0, 28, 0, 28, 0, 28, 0, 28, 0, 28, 0, 0, 28, 28, 28, 0, 28, 0, 28, 0, 28, 0, 28, 0, 28, 0, 28, 0, 28, 0, 28, 0, 28, 0, 28, 0, 28, 0, 28, 0, 28, 0, 28, 28, 28, 28, 28, "0" | JZCleanTipFlowResults | LeakageAir FlowRate_lbmhr ', Значение: 16285.188088630204,}, {Имя:' AirSide | JZCleanTipFlowResults | LeakageAirFlowRate_lbmhr_Unterminty ', Значение: 456.779511900225,}, {Имя:' AirSide | Использ. ', Значение: false,}, {Имя:' FuelSide | Топливо | Заголовок 0 | CleanTipResults | HR ', Значение: 10776333.422366736,}, {Имя:' FuelSide | Топливо | Заголовок 0 | CleanTipResults | HR_Unterminty ', Значение: 14383.420657232984, }, {Имя: 'FuelSide | Fuels | Заголовок 0 | CleanTipResults | HR_MMBTUhr', Значение: 36.77037592294784,}, {Имя: 'FuelSide | CleanTipResults | HR', Значение: 10776333.422366736,}, {Имя: 'FuelSide | CleanTipUesults ', Значение: 14383.420657232984,}]

Ответы [ 2 ]

1 голос
/ 17 апреля 2020

Я изложу свои мысли, так как здесь уже есть качественный ответ. Но, пожалуйста, в будущем 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 / . Они объединены в один список с flatMap.

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}
0 голосов
/ 17 апреля 2020

Если вы просто ищете ответ «копировать / вставить», я не стану давать объяснения. Но я не против завершить головоломку и поделиться своей работой -

  1. Если входной объект является объектом,
  2. "Сгладить" его.
  3. В противном случае, ввод не объект. Вернуть «плоский» результат.

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))

Выход -

[
  {
    "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
  }
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...