在带有 Javascript 的对象的 forEach 循环中进行切换是不好的做法吗?
Is it bad practice to have a switch within forEach loop of objects with Javascript?
我需要更改数组中两个对象的属性。所以我这样做了
var tabs = [
{name: 'A', visible: false},
{name: 'B', visible: true},
{name: 'C', visible: true}}
];
var changeTabsVisibility = () {
if(validation()){
tabs.forEach(tab => {
switch(tab.name) {
case 'A':
tab.visible = true;
break;
case 'B':
tab.visible = false;
break;
default:
break;
}
});
}
}
它按照预期的方式工作,但这是一个很好的做法还是最有效、最全面的方法?
我认为更清晰、更简洁、更不容易出错的版本是制作一个对象,将选项卡名称映射到它们的可见性。
const visibilityByTab = {
A: true,
B: false
}
tabs.forEach(tab => {
const newV = visibilityByTab[tab.name];
if (newV !== undefined) tab.visible = newV;
});
这更容易扩展到更多选项卡名称,并且不会在您忘记 break
.
时引入错误。
我认为 switch
声明在这种情况下并不有效。
它只是将名称转换为可见性,不是吗?
您的目标是将名称转换为可见性,因此只需要一个将名称转换为可见性的映射
这是我想的例子。
var tabs = [
{name: 'A', visible: false},
{name: 'B', visible: true},
{name: 'C', visible: true}}
];
const NAME_TO_VISIBLE = {
'A': true,
'B': false,
'C': true,
...
};
var changeTabsVisibility = () {
if(validation()){
tabs.forEach(tab => {
tab.visible = NAME_TO_VISIBLE[tab.name] || false;
});
}
}
我需要更改数组中两个对象的属性。所以我这样做了
var tabs = [
{name: 'A', visible: false},
{name: 'B', visible: true},
{name: 'C', visible: true}}
];
var changeTabsVisibility = () {
if(validation()){
tabs.forEach(tab => {
switch(tab.name) {
case 'A':
tab.visible = true;
break;
case 'B':
tab.visible = false;
break;
default:
break;
}
});
}
}
它按照预期的方式工作,但这是一个很好的做法还是最有效、最全面的方法?
我认为更清晰、更简洁、更不容易出错的版本是制作一个对象,将选项卡名称映射到它们的可见性。
const visibilityByTab = {
A: true,
B: false
}
tabs.forEach(tab => {
const newV = visibilityByTab[tab.name];
if (newV !== undefined) tab.visible = newV;
});
这更容易扩展到更多选项卡名称,并且不会在您忘记 break
.
我认为 switch
声明在这种情况下并不有效。
它只是将名称转换为可见性,不是吗?
您的目标是将名称转换为可见性,因此只需要一个将名称转换为可见性的映射
这是我想的例子。
var tabs = [
{name: 'A', visible: false},
{name: 'B', visible: true},
{name: 'C', visible: true}}
];
const NAME_TO_VISIBLE = {
'A': true,
'B': false,
'C': true,
...
};
var changeTabsVisibility = () {
if(validation()){
tabs.forEach(tab => {
tab.visible = NAME_TO_VISIBLE[tab.name] || false;
});
}
}