Преобразование строки, разделенной точками, во вложенный объект JSON в Angular / Typescript
Итак, я пробовал это в течение нескольких часов, мне нужна была помощь.
У меня есть строка с точками, которую мне нужно преобразовать во вложенные объекты JSON.
data=
"REPM.Action.Portfolio.budget.repairDetails.excelExport"+"."+
"REPM.Action.Portfolio.bsc.list.keyCalculate"+"."+
"REPM.Action.Portfolio.bsc.Overview.keyLoad"+"."+
"REPM.Action.Portfolio.budget.versionSelection.createVersion"+"."+
"REPM.Action.Portfolio.dcf.dcfCompare.keyExportWorksheet"+"."+
"REPM.Action.Portfolio.dcf.keyRateCompare.keyExportWorksheet"+"."+
"REPM.Action.Portfolio.dcf.keyScenario.keyClone"+"."+
"REPM.Action.Portfolio.dcf.keyScenario.keyDelete"+"."+
"REPM.Action.Portfolio.dcf.keyScenario.keyNewCalculation"+"."+
"REPM.Action.Portfolio.dcf.keyScenario.keyNewMandate"+"."+
"REPM.Action.Portfolio.dcf.keySelection.keyDefinitive";
Ожидается, что результат будет выглядеть примерно так
{
"REPM": {
"Action": {
"Portfolio": {
"budget": {
"repairDetails": {
"excelExport": null
},
"versionSelection": {
"createVersion": null
}
},
"bsc": {
"list": {
"keyCalculate": null
},
"Overview": {
"keyLoad": null
}
},
"dcf": {
"dcfCompare": {
"keyExportWorksheet": null
},
"keyRateCompare": {
"keyExportWorksheet": null
},
"keyScenario": {
"keyClone": null,
"keyDelete": null,
"keyNewCalculation": null,
"keyNewMandate": null,
},
"keySelection": {
"keyDefinitive": null
}
}
}
}
}
}
В настоящее время пробовал ...
var tempObject = {};
var value = this.receivedString.split('.')
console.log(value.length)
var curr = tempObject;
for (var i = 0; i < value.length; i++) {
var next = {}
curr[value[i]] = next;
curr = next;
}
}
Это дает мне плоский объект, в котором каждый объект находится внутри другого, с повторяющимися свойствами.
{
"REPM":{
"Action":{
"Portfolio":{
"budget":{
"repairDetails"{
"excelExport":{
"REPM":{
"Action":{
"Portfolio":{ //and so on...
}
}
}
}
}
}
}
}
}
}
был бы признателен за помощь, спасибо.
1 ответ
Решение
Что ж, вот он, но этот алгоритм немного продвинутый. На то, чтобы осознать, может потребоваться некоторое время. Сообщите мне, если мое объяснение не имеет смысла.
- Вам нужно создать пустой объект JavaScript.
- Идите по веренице, запись за записью.
- С новыми именами свойств вы создаете новый объект в вашей текущей позиции в объекте JavaScript. Этот объект становится вашим новым «уровнем» вложенности.
- При повторяющихся именах свойств вы перескакиваете на этот уровень в своем объекте JavaScript.
(Когда вы закончите, вы конвертируете все пустые объекты в
null
, что на самом деле требует больше строк кода.)
const data =
"REPM.Action.Portfolio.budget.repairDetails.excelExport"+"."+
"REPM.Action.Portfolio.bsc.list.keyCalculate"+"."+
"REPM.Action.Portfolio.bsc.Overview.keyLoad"+"."+
"REPM.Action.Portfolio.budget.versionSelection.createVersion"+"."+
"REPM.Action.Portfolio.dcf.dcfCompare.keyExportWorksheet"+"."+
"REPM.Action.Portfolio.dcf.keyRateCompare.keyExportWorksheet"+"."+
"REPM.Action.Portfolio.dcf.keyScenario.keyClone"+"."+
"REPM.Action.Portfolio.dcf.keyScenario.keyDelete"+"."+
"REPM.Action.Portfolio.dcf.keyScenario.keyNewCalculation"+"."+
"REPM.Action.Portfolio.dcf.keyScenario.keyNewMandate"+"."+
"REPM.Action.Portfolio.dcf.keySelection.keyDefinitive";
function recurrentDotSplit( data ) {
const keys = {};
let result = null, level = null;
const entries = data.split( '.' );
for( const entry of entries ) {
if( ! keys[ entry ] ) {
keys[ entry ] = {};
if( level ) level[ entry ] = keys[ entry ]
}
if( ! result ) result = { [ entry ]: keys[ entry ] };
level = keys[ entry ];
}
const ennulled = new Set();
function ennull( o ) {
if( ennulled.has( o ) ) return o;
ennulled.add( o );
const keys = Object.keys( o );
if( keys.length === 0 ) return null;
Object.keys( o ).forEach( key => o[ key ] = ennull( o[ key ] ) );
return o;
}
ennull( result );
return result;
}
var objectStructure = recurrentDotSplit( data );
console.log( objectStructure );