- 1 -
最近工作中碰到个本来比较基础的问题——按多个条件进行判断进行分类。
问题简化后判断逻辑分组如下:
1、男
1.1 码数S,结果为“男小”
1.2 码数M,结果为“男中”
1.3 其它,结果为“男大”
2、女
1.1 码数S,结果为“女小”
1.2 码数M,结果为“女中”
1.3 其它,结果为“女大”
3、男女不明确,结果为“中性定制”
这个问题本身并不复杂,比如可以直接转换为多层嵌套的if语句,轻松得到结果:
完整公式如下:
代码语言:javascript复制= if [男女]="男"
then if [码数]="S"
then "男小"
else if [码数]="M"
then "男中"
else "男大"
else if [男女]="女"
then if [码数]="S"
then "女小"
else if [码数]="M"
then "女中"
else "女大"
else "中性定制"
不过,看着这一层又一层的if...then...else...,是不是内心在呼唤:能不能换个方式,简洁点儿啊?
- 2 -
办法其实是有的,但如果直接给答案,可能对部分函数不太熟悉的朋友来说理解起来不太容易,我们先进一步简化这个例子,先看看单一条件下怎么处理:
这个问题的基本逻辑很简单:
- 如果码数为S,则为小码;
- 如果码数为M,则为中码;
- 如果码数为L,则为大码;
- 其它则为“各种加大”
直接用if...then...else...写起来(或者直接操作条件列)也很容易,不过这也套了3层了:
先说一种常见的替代方法,将确定的关系做成一个列表,如:{{"S","小码"},{"M","中码"},{"L","大码"}}。
然后,通过List.Select函数加条件进行筛选取值,对于剩下的取不到的,用try...otherwise...结构进行处理,如下图所以:
这种方法在一定程度上比if...then...else...要结构化一些,但因为要用try...otherwise...进行附加处理,所以也并不是很理想的办法:
- 一是效率上可能会比较低(一般不建议使用)
- 二是在增加判断条件时,也会进一步增加嵌套的次数。
那么,是否有某些函数,本身就带了类似的“不符合条件”情况下赋值的功能呢?因为只有这样,我们才能避免如上面“各种大码”的专门处理的层次。
翻了一下M的函数,还真有:Record.FieldOrDefault,这个问题用该函数解决如下:
用这个函数的思路很简单:
- 即将明确的条件(码数作为字段名)构建一个记录:[S="小码",M="中码", L="大码"];
- 通过Record.FieldOrDefault函数直接根据[码数]对记录进行取值;
- 对于取不到记录值的情况,直接赋值(“各种加大”)
- 3 -
有了前面对于Record.FieldOrDefault函数的基础,我们再看文章开始案例的多个条件的情况下怎么用。
1、最外层Record.FieldOrDefault
我们要先对最里层的明确条件构建记录:[男S="男小", 男M="男中", 女S="女小", 女M="女中"],这样,我们就可以通过“[男女]&[码数]”作为记录的字段名直接取到相应的值。
2、嵌套里的Record.FieldOrDefault
对于2个条件不满足的情况(剩余的男女明确的还有:男大、女大,男女不明确的为“中性定制”)用Record.FieldOrDefault函数的第三个参数嵌套进一步处理:即,构建与[男女]相关的记录并读取,读取不到的情况下标记为“中性定制”。
- 4 -
对于多条件判断的问题,在对更多的函数熟悉的基础上,可以根据不同的情况选择不同的方式进行一定程度的简化。
当然,也并不是说,代码越短就越好,或者函数或嵌套层次越少就越好,根据自己的实际情况,快速解决工作中的实际问题即可。
配套文件下载: