Objet de conversion par espace de noms

J’ai besoin de convertir un “object plat” comme ceci (données d’entrée):

{ 'prop1': 'value.1', 'prop2-subprop1': 'value.2.1', 'prop2-subprop2': 'value.2.2', } 

à l’object d’immersion comme ceci (données de sortie):

 { 'prop1': 'value.1', 'prop2': { 'subprop1': 'value.2.1', 'subprop2': 'value.2.2' } } 

Bien sûr, la solution doit être préparée pour un niveau profond sans limite.

Ma solution ne fonctionne pas:

 var inputData = { 'prop1': 'value.1', 'prop2-subprop1': 'value.2.1', 'prop2-subprop2': 'value.2.2', }; function getImmersionObj(input, value) { var output = {}; if ($.type(input) === 'object') { // first start $.each(input, function (prop, val) { output = getImmersionObj(prop.split('-'), val); }); } else if ($.type(input) === 'array') { // recursion start $.each(input, function (idx, prop) { output[prop] = output[prop] || {}; output = output[prop]; }); } return output; } console.log(getImmersionObj(inputData)); // return empty object 

Pouvez-vous m’aider à trouver le problème dans mon code ou peut-être en connaissez-vous un autre, un meilleur algorithme de conversion comme le mien?

Vous pouvez utiliser une fonction pour diviser le chemin en valeur et générer de nouveaux objects pour celle-ci.

 function setValue(object, path, value) { var way = path.split('-'), last = way.pop(); way.reduce(function (o, k) { return o[k] = o[k] || {}; }, object)[last] = value; } var object = { 'prop1': 'value.1', 'prop2-subprop1': 'value.2.1', 'prop2-subprop2': 'value.2.2' }; Object.keys(object).forEach(function (key) { if (key.indexOf('-') !== -1) { setValue(object, key, object[key]); delete object[key]; } }); console.log(object); 
 .as-console-wrapper { max-height: 100% !important; top: 0; } 
 var input = { "property1": "value1", "property2.property3": "value2", "property2.property7": "value4", "property4.property5.property6.property8": "value3" } function addProp(obj, path, pathValue) { var pathArray = path.split('.'); pathArray.reduce(function (acc, value, index) { if (index === pathArray.length - 1) { acc[value] = pathValue; return acc; } else if (acc[value]) { if (typeof acc[value] === "object" && index !== pathArray.length - 1) { return acc[value]; } else { var child = {}; acc[value] = child; return child; } } else { var child = {}; acc[value] = child; return child; } }, obj); } var keys = Object.keys(input); var output = {}; keys.forEach(function (k) { addProp(output, k, input[k]); }); console.log(output);