这JS判断怎么简化,把我给看晕了
const isDel = (op, o) => {
let fal = false;
if (op.is_show_lock && op.is_show_sf && op.is_show_bz) {
if (o.is_lock && o.is_sf && o.is_bz) {
fal = false;
} else {
fal = true;
}
} else if (op.is_show_lock && op.is_show_sf) {
if (o.is_lock && o.is_sf) {
fal = false;
} else {
fal = true;
}
} else if (op.is_show_lock && op.is_show_bz) {
if (o.is_lock && o.is_bz) {
fal = false;
} else {
fal = true;
}
} else if (op.is_show_sf && op.is_show_bz) {
if (o.is_sf && o.is_bz) {
fal = false;
} else {
fal = true;
}
} else if (op.is_show_lock) {
if (o.is_lock) {
fal = false;
} else {
fal = true;
}
} else if (op.is_show_sf) {
if (o.is_sf) {
fal = false;
} else {
fal = true;
}
} else if (op.is_show_bz) {
if (o.is_bz) {
fal = false;
} else {
fal = true;
}
}
return fal;
};
----------------------完整-----------------------------
<template>
<div style="margin-bottom: 20px; margin-top: 20px;">
<label><input type="checkbox" v-model="show_gl.is_show_gl1" /> 过滤一</label>
<label><input type="checkbox" v-model="show_gl.is_show_gl2" /> 过滤二</label>
<label><input type="checkbox" v-model="show_gl.is_show_gl3" /> 过滤三</label>
</div>
<div>
<table>
<template v-for="(item, index) in list" :key="index">
<tr v-if="item.is_show">
<td>{{item.id}}</td>
<td>{{item.is_gl1}}</td>
<td>{{item.is_gl2}}</td>
<td>{{item.is_gl3}}</td>
</tr>
</template>
</table>
</div>
</template>
<script>
import {reactive, ref, watch} from "vue";
export default {
name: "Test",
setup() {
const show_gl = reactive({
is_show_gl1: false,
is_show_gl2: false,
is_show_gl3: false,
});
const list = ref([
{
id: 1,
is_gl1: false,
is_gl2: true,
is_gl3: false,
is_show: true,
},
{
id: 2,
is_gl1: false,
is_gl2: false,
is_gl3: true,
is_show: true,
},
{
id: 3,
is_gl1: false,
is_gl2: true,
is_gl3: false,
is_show: true,
},
{
id: 4,
is_gl1: true,
is_gl2: true,
is_gl3: true,
is_show: true,
},
{
id: 5,
is_gl1: false,
is_gl2: true,
is_gl3: false,
is_show: true,
},
{
id: 6,
is_gl1: true,
is_gl2: false,
is_gl3: false,
is_show: true,
},
]);
watch(show_gl, () => {
for (let i = 0; i < list.value.length; i++) {
if (show_gl.is_show_gl1 || show_gl.is_show_gl2 || show_gl.is_show_gl3) {
if (show_gl.is_show_gl1 && show_gl.is_show_gl2 && show_gl.is_show_gl3) {
if (list.value[i].is_gl1 && list.value[i].is_gl2 && list.value[i].is_gl3) {
list.value[i].is_show = true;
} else {
list.value[i].is_show = false;
}
} else if (show_gl.is_show_gl1 && show_gl.is_show_gl2) {
if (list.value[i].is_gl1 && list.value[i].is_gl2) {
list.value[i].is_show = true;
} else {
list.value[i].is_show = false;
}
} else if (show_gl.is_show_gl1 && show_gl.is_show_gl3) {
if (list.value[i].is_gl1 && list.value[i].is_gl3) {
list.value[i].is_show = true;
} else {
list.value[i].is_show = false;
}
} else if (show_gl.is_show_gl2 && show_gl.is_show_gl3) {
if (list.value[i].is_gl2 && list.value[i].is_gl3) {
list.value[i].is_show = true;
} else {
list.value[i].is_show = false;
}
} else if (show_gl.is_show_gl1) {
if (list.value[i].is_gl1) {
list.value[i].is_show = true;
} else {
list.value[i].is_show = false;
}
} else if (show_gl.is_show_gl2) {
if (list.value[i].is_gl2) {
list.value[i].is_show = true;
} else {
list.value[i].is_show = false;
}
} else if (show_gl.is_show_gl3) {
if (list.value[i].is_gl3) {
list.value[i].is_show = true;
} else {
list.value[i].is_show = false;
}
}
} else {
list.value[i].is_show = true;
}
}
});
return {show_gl, list}
},
}
</script>
<style scoped>
table, td {
border: solid 1px #666;
}
td {
padding: 5px 10px;
}
label {
margin-right: 20px;
}
</style>
其实就是一个过滤功能
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
https://codepen.io/1567887123...
昨天有点忙,只留了代码。今天来补个解释。
观察问题,总结规律:
op.is_show_xxx
和o.is_xxx
成对出现op.is_show_xxx
为true
的时候才需要判断o.is_xxx
(过滤)o.is_xxx
用&&
组合条件,得到计算结果因为
op.is_show_xxx
和op.is_xxx
数量相当,而且不多。原回答(见下面)通过数组索引的方式来关联他们。然后在一次遍历(reduce
部分)中同时进行过滤(三元运算)和布尔计算(合并r
值)。因为是 and 运算,所以初始值给true
。最后将结果取反输出。原回答这个解法虽然有一定的效率,但不是很容易理解,今天再写个按上面分析分步骤进行的:
不习惯看这种函数式的处理方式,来个原始一点
for..of
循环的这一段中的遍历部分(初始化
result
和for
)直接翻译成reduce
形式就是:中间的
if...else...
看起来不清爽,处理一下(VS 的重构很方便)问题中的
isDel
保留,方便做单元测试对比,定义了一个isRemove
:测试用例:
全部通过
补充一下:就我看提问者上面的这代码质量,他的实现肯定是有问题的,决对不是真正解决他需求的最优解,感觉提问者可以把你的需求提出来。
我是真不知道为什么会给我推这个问题,看了大家答案,你们是不是都被提问题的人带偏了?他这很明显就是一个 VUE 项目,一个应该是
computed
去干的事情,为啥都在用watch
改list
的数据,然后,他这个里面的逻辑,就我个人理解,最核心的就两个点:is_show_xxx
那么item.is_xxx
就必须为true
is_show_xxx
,那么item.is_xxx
不参与是否展示的判断也说了,有很多这种成对出现的
is_xxx
和is_show_xxx
,所以,简单来说,就两步:item
的所有is_xxx
is_show_xxx
是否为false
,如果为false
不参与判断,那么这条field
直接过,如果为true
,参与判断,再判断一个item.is_xxx
是否为true
就可以了,判断的时候,要求所有满足条件的都为true
,所以使用的是every
然后,还是想多说几句
Vue
提供了那么好用的Computed
不用filteredList
里面拿数据就可以了(只要是这个list
里面的,is_show
就一定为true
,否则就为false
,提交的时候批量改一下这个值就可以了)似乎是要一一对应的意思
我拿位运算口胡了个
似乎是逻辑蕴含的意思,我再口胡一个
思路:找到list和showObject的字段共同点,便于进行判断,这里共同点就是他们结尾的字符串一样(_gl1),这个你可以根据你的业务场景修改,然后就是你这里的筛选是取并集的,所以在第二层判断那里我把show用数组存起来了,在外层用reduce计算一次并集,把最后的计算结果赋值就可以了,还有一点就是,你这里如果没有筛选,默认就是全显示的,所有reduce的默认值给的是true
const isRemove = (op, o) => (op.is_show_lock && !o.is_lock) || (op.is_show_sf && !o.is_sf) || (op.is_show_bz && !o.is_bz)
之前的回答有误,没有验证,凭感觉写的,这次应该没问题了。借用了@边城 的测试。
主要就是运用布尔代数简化表达式,提取了true的情况,列出所有true的布尔逻辑然后根据法则做运算即可
布尔代数运算律
watch(show_gl, () => {
});