原始对象:{ 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,}
发布于 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将这些连接到单个列表中。
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}
发布于 2020-04-18 04:45:59
如果你只是在寻找一个复制/粘贴的答案,我不会费心提供太多的解释。但我不介意完成拼图和分享我的作品-
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
}
]https://stackoverflow.com/questions/61266520
复制相似问题