¿Cómo implementamos un util flatten para aplanar esto?
myMap = { 'a': 5, 'b': 6, 'c': { 'f': 9, 'g': { 'm': 17, 'n': 3 } } }a
flatten(myMap) = { 'a': 5, 'b': 6, 'c.f': 9, 'cgm': 17, 'cgn': 3, }?
Encontré aquí una implementación https://github.com/lukeed/flattie/blob/master/src/index.js pero no pude entender el código. ¿Puede alguien darme una versión más legible?
Puedes usar este código:
myMap = { 'a': 5, 'b': 6, 'c': { 'f': 9, 'g': { 'm': 17, 'n': 3 } } } function flatten(obj, pKey = null, res = {}) { for (let key in obj) { const name = pKey ? `${pKey}.${key}` : key; if (typeof obj[key] === "object" && !Array.isArray(obj[key])) { flatten(obj[key], name, res); } else { res[name] = obj[key]; } } return res; } console.log(flatten(myMap)) puedes usarlo flatten(myMap) . En realidad, es simple, pero a veces genera confusión. cómo funciona es haciendo un bucle y luego verificando, si es un objeto y luego llamándose a sí mismo nuevamente (recursivo) para crear un objeto clave profundamente y, si no, crear un objeto clave hasta allí.
Aquí hay quizás una versión un poco más simple:
const inputObject = { a: 5, b: 6, c: { f: 9, g: { m: 17, n: 3 } } } function flatten(input, keys = [], output = {}) { for (key in input) { const value = input[key] const combinedKeys = [...keys, key] if (typeof value === 'object') { output = flatten(value, combinedKeys, output) } else { output[combinedKeys.join('.')] = value } } return output } console.log(flatten(inputObject)) /* Logs: * { * "a": 5, * "b": 6, * "cf": 9, * "cgm": 17, * "cgn": 3 * } */ La idea es observar recursivamente todas las propiedades del objeto y construir un archivo . -clave separada a medida que profundizamos hasta llegar a un valor hoja.
Puede leer más sobre las funciones recursivas aquí: https://www.freecodecamp.org/news/what-is-recursion-in-javascript/
Aquí hay una opción:
// Declare an object myMap = { 'a': 5, 'b': 6, 'c': { 'f': 9, 'g': { 'm': 17, 'n': 3 } } } // Declare a flatten function that takes // object as parameter and returns the // flatten object const flattenObj = (myMap) => { // The object which contains the // final result let result = {}; // loop through the object "ob" for (const i in myMap) { // We check the type of the i using // typeof() function and recursively // call the function again if ((typeof myMap[i]) === 'object' && !Array.isArray(myMap[i])) { const temp = flattenObj(myMa**strong text**p[i]); for (const j in temp) { // Store temp in result result[i + '.' + j] = temp[j]; } } // Else store ob[i] in result directly else { result[i] = myMap[i]; } } return result; }; console.log(flattenObj(myMap));