¿Qué alternativa puedo usar en lugar de la condición if? Tengo que escribir del 10 al 15 de condiciones if y dentro de ellas podríamos tener otras condiciones if. Entonces, me preguntaba si hay alguna alternativa para que el código se vea mejor. Algo así como interruptores de caja.
if (sns.Trigger.Namespace == "AWS/ApiGateway") { if (dimensionName('ApiId') && dimensionName('Stage')) { var sns_DimensionsValue = dimensionValue('ApiId') + '_' + dimensionValue('Stage') } else if (dimensionName('ApiName') && dimensionName('Stage')) { var sns_DimensionsValue = dimensionValue('ApiName') + '_' + dimensionValue('Stage') } else if (dimensionName('ApiId')) { var sns_DimensionsValue = dimensionValue('ApiId') } else if (dimensionName('ApiName')) { var sns_DimensionsValue = dimensionValue('ApiName') } } if (sns.Trigger.Namespace == "AWS/S3") { var sns_DimensionsValue = dimensionValue('BucketName') + '_' + dimensionValue('StorageType') } # if AWS/Logs if AWS/Lambda Básicamente, tengo que verificar si los datos JSON tienen ciertas claves frente a otras claves en cada espacio de nombres y luego construir una variable. Estos datos JSON son del evento de AWS Cloudwatch. La función dimensionName consulta los datos JSON para ver si el name que pasamos existe en json. dimensionValue devuelve el valor de la clave de los datos JSON.
Puede usar switch en su lugar: https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Statements/switch
Puedes usarlo así:
var myVar = myFunc(); // Get some value switch(myVar) { // Test value possibilities case "hello": console.log("Say hello"); // Your code for "hello" case here break; case "Bye": console.log("Say bye"); // Your code for "bye" case here break; }Notas:
Editar:
En su caso, el problema es sin duda la lógica de funcionamiento. Si desea verificar la presencia clave en JSON, tal vez pueda iterar sobre su JSON de esta manera:
Object.keys(myJson).forEach((key) => { switch (key) { case "key1": // "key1" is in json // Code here for "key1" presence break; // etc... } });Nota:
Dado que la cantidad de declaraciones de flujo de control es muy pequeña en su caso, if-else estaría bien por sí solo, o puede usar declaraciones de cambio
Si quieres ir por algo diferente, puedes usar arreglos como este
cada matriz anidada contiene, por ejemplo [[obj.a, obj.b]] that corresponds to if (obj.a && obj.b)`, podemos recorrer esta matriz y luego filtrar indefinido (en el caso en que la propiedad del objeto no existe)
En el siguiente ejemplo, la primera condición es [obj.a, obj.c], que falla porque la propiedad c no existe en obj y se resolverá como indefinida, y la siguiente condición es [obj.a, obj.b] que pasa como que ambos son válidos en obj y devolverá los valores unidos por _
const obj = { a: 'al', b: 'bl' } const params = [[obj.a, obj.c], [obj.a, obj.b], [obj.b]]; let result; for (let i = 0; i < params.length; i++) { const x = params[i]; const value = x.filter(x => x != undefined).length == x.length ? x.join('_') : null; if (value) { // condition passes, no need to continue the loop result = value; break; } } console.log('Final variable value is -> ', result); Nota: una mejor solución sería usar switch , pero esta es solo una de las posibles alternativas a if-else