Nodejs if else alternative



我可以用什么替代if条件?我必须写一个10到15个if条件,在它们里面我们可能还有其他if条件。所以我想知道是否有其他选择可以让代码看起来更好?类似于箱子开关的东西。

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

基本上,我必须检查JSON数据在每个命名空间中是否有某些键和其他键,然后构造一个变量。此JSON数据来自AWS Cloudwatch事件。dimensionName函数查询JSON数据,看看我们传递的name是否存在于JSON中。。dimensionValue从JSON数据中返回键的值。

由于在您的情况下控制流语句的数量非常少,if-else本身就可以,或者您可以使用切换语句

如果你想追求不同的东西,你可以使用像这样的阵列

每个嵌套数组都包含[[obj.a, obj.b]] that corresponds to,如果(obj.a&&obj.b(`,我们可以循环通过这个数组,然后过滤掉未定义的(在对象属性不存在的情况下(

在以下示例中,第一个条件是[obj.a,obj.c],由于属性cobj中不存在,它将解析为未定义,因此失败;下一个条件是[obj.a,obj.b],由于它们在obj中都有效,它将通过,并返回_连接的值

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);

注意:更好的解决方案是使用switch,但这只是if else 的可能替代方案之一

您可以改用switch:https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Statements/switch

你可以这样使用它:

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;
}

注:

  • 开关可用于测试多种可变状态
  • 如果您的语句少于5个,则If/else更好
  • 超过5,使用开关而不是if/else
  • 通过";"更好";我的意思是更快、资源密集度更低

编辑:

在你的情况下,问题当然是操作逻辑。如果你想检查JSON中的密钥存在,你可以像这样迭代你的JSON:

Object.keys(myJson).forEach((key) => {
switch (key) {
case "key1": // "key1" is in json
// Code here for "key1" presence
break;
// etc...
}
});

注:

  • Object.keys文档:https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Global_Objects/Object/keys

最新更新