Преобразование строки, разделенной точками, во вложенный объект 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 ответ

Решение

Что ж, вот он, но этот алгоритм немного продвинутый. На то, чтобы осознать, может потребоваться некоторое время. Сообщите мне, если мое объяснение не имеет смысла.

  1. Вам нужно создать пустой объект JavaScript.
  2. Идите по веренице, запись за записью.
  3. С новыми именами свойств вы создаете новый объект в вашей текущей позиции в объекте JavaScript. Этот объект становится вашим новым «уровнем» вложенности.
  4. При повторяющихся именах свойств вы перескакиваете на этот уровень в своем объекте 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 );
Другие вопросы по тегам