Estoy tratando de producir el objeto mencionado a continuación a partir de la matriz. Probé map and push desde Javascript pero no pude lograrlo. Proporcione un poco de pegamento para realizar esto.
fn(); function fn() { var env = 'uat'; var userInput = 'appA'; var listOfApplications = [ { "appName":"common", "data":{ "uat":{ "baseUrl":"http://commonurl.com", "parameterX":"x", "parameterY":"y" } } }, { "appName":"appA", "data":{ "uat":{ "baseUrl":"http://uat.appA.com", "parameterA":"a", "parameterB":"b" } } }, { "appName":"appB", "data":{ "uat":{ "baseUrl":"http://uat.appB.com", "parameterC":"d", "parameterD":"c" } } } ]; var config = {}; switch (env) { case "uat": for (const s of listOfApplications) { if (userInput == s.appName || 'common' == s.appName) { config[s.appName] = s.appName config = s.data['uat'] } } break; } console.log(config); return config; }
Estoy tratando de producir el resultado mencionado a continuación.
{ "baseUrl": "http://commonurl.com", "parameterX": "x", "parameterY": "y", "appA": { "baseUrl": "http://uat.appA.com", "parameterA": "a", "parameterB": "b" } }
Por favor ayúdame con esto
Problema:
Primero, quiero explicar los problemas en su código:
La línea
config[s.appName] = s.appName
establece una propiedad en config
pero la siguiente línea
config = s.data['uat']
reasigna un nuevo objeto y sobrescribe todos los cambios anteriores. Hacer esto en un bucle da como resultado una config
que contiene s.data['uat']
de la última iteración del bucle donde
userInput == s.appName || 'common' == s.appName
devuelve true
. Eso significa que la config
contiene la configuración común o la configuración de la aplicación. También modifica involuntariamente sus datos originales. Después de la primera iteración del bucle, config = s.data['uat']
establece una referencia a un objeto en su objeto original. Luego, config = s.data['uat']
agrega una propiedad a este objeto. Puedes ver el problema con un console.log
:
fn(); function fn() { var env = 'uat'; var userInput = 'appA'; var listOfApplications = [{"appName": "common","data": {"uat": {"baseUrl": "http://commonurl.com","parameterX": "x","parameterY": "y"}}},{"appName": "appA","data": {"uat": {"baseUrl": "http://uat.appA.com","parameterA": "a","parameterB": "b"}}},{"appName": "appB","data": {"uat": {"baseUrl": "http://uat.appB.com","parameterC": "d","parameterD": "c"}}}]; var config = {}; switch (env) { case "uat": for (const s of listOfApplications) { if (userInput == s.appName || 'common' == s.appName) { config[s.appName] = s.appName config = s.data['uat'] } } break; } console.log(listOfApplications); return config; }
El primer elemento de la matriz en listOfApplications
obtuvo una propiedad nueva sin querer.
Solución:
Parece que el resultado esperado es un objeto que contiene todas las propiedades de la configuración común y una propiedad con la configuración de la aplicación. Puede encontrar ambas configuraciones usando Array#find
:
fn(); function fn() { const env = 'uat'; const userInput = 'appA'; const listOfApplications = [{"appName": "common","data": {"uat": {"baseUrl": "http://commonurl.com","parameterX": "x","parameterY": "y"}}},{"appName": "appA","data": {"uat": {"baseUrl": "http://uat.appA.com","parameterA": "a","parameterB": "b"}}},{"appName": "appB","data": {"uat": {"baseUrl": "http://uat.appB.com","parameterC": "d","parameterD": "c"}}}]; const config = { ...listOfApplications.find(({ appName }) => appName === 'common')?.data[env], [userInput]: { ...listOfApplications.find(({ appName }) => appName === userInput)?.data[env] } }; console.log(config); return config; }
Creé una copia superficial de la configuración de la aplicación para evitar modificaciones inesperadas del objeto original. Para mí, configuraciones complejas con objetos anidados, debería considerar una copia profunda.