在javascript中重构/简化多个if条件
网页上有多个select标记,用于隐藏或显示表格行 该逻辑在javascript中使用多个if/else if条件实现,我正在寻找一种简化它的方法:在javascript中重构/简化多个if条件,javascript,Javascript,网页上有多个select标记,用于隐藏或显示表格行 该逻辑在javascript中使用多个if/else if条件实现,我正在寻找一种简化它的方法: if( (validPublication == true) && (productPublication > 0) && (genre == -1 || $(this).data('genre') == genre) && identificator_shared == fal
if(
(validPublication == true)
&& (productPublication > 0)
&& (genre == -1 || $(this).data('genre') == genre)
&& identificator_shared == false
&& (format == 'foo' && $(this).data('foo') == true)
&& (identificator_version == -1 || $(this).data('topic_version') == identificator_version)
) {
$('#filter_topic_version_eq').removeAttr('disabled');
$('#filter_identificator_version_eq').removeAttr('disabled');
$('#filter_genre_eq').removeAttr('disabled');
$('#filter_format_eq').removeAttr('disabled');
$(this).show();
if ($(this).data('product')) {
products.push($(this).data('product'));
}
}
else if(
(validPublication == true)
&& (productPublication > 0)
&& (genre == -1 || $(this).data('genre') == genre)
// if format foo && drvt_shared=true dann alle Versionen anzeigen
&& (format == 'foo' && (identificator_shared == true))
&& ($(this).data('foo') == true)
) {
$('#filter_topic_version_eq').removeAttr('disabled');
$('#filter_identificator_version_eq').removeAttr('disabled');
$('#filter_format_eq').removeAttr('disabled');
$('#filter_genre_eq').removeAttr('disabled');
$(this).show();
if ($(this).data('product')) {
products.push($(this).data('product'));
}
}
else if(
(validPublication == true)
&& (productPublication > 0)
&& (genre == -1 || $(this).data('genre') == genre)
&& (format == 'bar' && (identificator_shared == false))
&& ($(this).data('bar') == true)
&& (identificator_version == -1 || $(this).data('topic_version') == identificator_version)
) {
$('#filter_format_eq').removeAttr('disabled');
$('#filter_genre_eq').removeAttr('disabled');
$('#filter_topic_version_eq').removeAttr('disabled');
$('#filter_identificator_version_eq').removeAttr('disabled');
$(this).show();
if ($(this).data('product')) {
products.push($(this).data('product'));
}
}
... and so on
我不认为使用switch语句会有很大的改进
===
更新:
注释中给出了在单独函数中提取if条件的建议
而不是
if (validPublication == true)
&& (productPublication > 0)
&& (genre == -1 || $(this).data('genre') == genre)
&& identificator_shared == false
&& (format == 'foo' && $(this).data('foo') == true)
&& (identificator_version == -1 || $(this).data('topic_version') == identificator_version)
)
我应该使用:
function foo(validPublication, productPublication, genre,identificator_shared,format,identificator_version) {
if(
(validPublication == true)
&& (productPublication > 0)
&& (genre == -1 || $(this).data('genre') == genre)
&& identificator_shared == false
&& (format == 'foo' && $(this).data('foo') == true)
&& (identificator_version == -1 || $(this).data('topic_version') == identificator_version)
) {
return true
}
}
因此,主要条件如下所示:
if foo(validPublication, productPublication, genre,identificator_shared,format,identificator_version)
else if(bar())
else if(baz())
我理解正确吗?我尽了最大努力减少代码,它可以更好,但会很复杂 你应该多读一些关于DRY的东西(不要重复你自己),它会帮助你避免这种情况,并编写简单易读的代码 这可能对你有帮助
function isProductPublication(productPublication) {
return productPublication > 0;
}
function isgenre(elm) {
return genre == -1 || $(elm).data('genre') == genre;
}
function isEqual(check, value) {
return check == value;
}
function _do(elm) {
$('#filter_topic_version_eq').removeAttr('disabled');
$('#filter_identificator_version_eq').removeAttr('disabled');
$('#filter_genre_eq').removeAttr('disabled');
$('#filter_format_eq').removeAttr('disabled');
$(elm).show();
if ($(elm).data('product')) {
products.push($(elm).data('product'));
}
}
if (
(isEqual(validPublication, true) && isProductPublication(productPublication) && isgenre(this))
&&
(
(isEqual(identificator_shared, false) && (isEqual(format, 'foo') && isEqual($(this).data('foo'), true)) && (isEqual(identificator_version, -1) || isEqual($(this).data('topic_version'), identificator_version)))
|| (isEqual(format, 'foo') && isEqual(identificator_shared, true) && isEqual($(this).data('foo'), true))
|| (isEqual(format, 'bar') && isEqual(identificator_shared == false) && isEqual($(this).data('bar'), true) && (isEqual(identificator_version, -1) || isEqual($(this).data('topic_version'), identificator_version)))
)
) {
_do(this);
}
如果要将复杂语句提取到一个单独的函数中,并对其命名,以便清楚地了解您的意图,其中一个选项是。
if
变为if(某个可理解的(x,y,z))。。。否则,如果(somethingElse())…
。嵌套东西也会有所帮助,看起来每个分支都有相同的条件。您可以为此添加ifconditions@WiktorZychla请看我更新的帖子。我不确定我是否理解正确