内容简介:时间:2018年11月02日有一列数据需要进行内容的校验,总共有三个,如果有第一个,第二第三可以为空;有第一第二,第三可以为空;有第一和第三,第二不能为空;有第二和第三,第一不能为空;三者可以同时为空,以此类推。如下表所示总体就分这八种情况,四种可能,四种不可能。
时间:2018年11月02日
有一列数据需要进行内容的校验,总共有三个,如果有第一个,第二第三可以为空;有第一第二,第三可以为空;有第一和第三,第二不能为空;有第二和第三,第一不能为空;三者可以同时为空,以此类推。如下表所示
1 | 2 | 3 | OK? |
---|---|---|---|
无 | 无 | 无 | Y |
有 | 无 | 无 | Y |
有 | 有 | 无 | Y |
有 | 有 | 有 | Y |
有 | 无 | 有 | N |
无 | 有 | 有 | N |
无 | 有 | 无 | N |
无 | 无 | 有 | N |
总体就分这八种情况,四种可能,四种不可能。
一开始我的思维逻辑出了问题,觉得应该一层层判断,比方说这样:
if (condition) { if (condition) { if (condition) { } } else { if (condition) { } else { } } } else { } 复制代码
通过这样来一层层判断,可是这实在是很没有逻辑的代码,不仅看上去很诡异 ,而且若是日后需要改,改的那个人看到这段代码也会喷死我的。
又或者说我可以列出这4种情况,然后所有的情况都检测一遍,比方说这样:
if (condition1 || condition2 || condition3 | condition4) { } else { } 复制代码
看上去还可以,但实际问题是 condition
不可能这么短,实际还是比较长的,所以只能另寻他法。
仔细思考之后,加上同事的帮助,我们可以发现在正确的情况下,最后一个有值的数据之前没有空。这是什么意思呢?比方说 有-有-无
这种情况, 最后一个有值的数据是第二个有,第二个有之前没有空的数据,所以这种情况是正确的。那么 有-无-有
这种情况,最后一个有值的数据是第三个有,但这里的第二个是空,所以不成立,是错误的。
那么在这种情况下,我们可以想到通过对比来数据的 index
值来判断是否正确,首先我们需要获取到原生数组的 index
值,我们可以把这个值放到数据中的元素中:
arr = _.map(arr, (op, index) => ({ ...op, index, })); 复制代码
_.map
方式是 lodash
提供的一个循环集合的方法,我们直接 return
一个值, return
的结果中包含了原生的 op
,同时增加了 index
属性,使用的是ES6的解构赋值方法。这样我们集合中的元素就有了 index
属性了。
之后我们再获取到过滤之后的集合,使用 lodash
的 _.filter
方法:
const existence = _.filter(arr, (op) => { return (op.code != null) && op.code.trim() !== ''; // 这里的code就是我们之前说的是否为空的值 }); 复制代码
这样我们就获取到了过滤之后的数据,接下来我们开始进行对比:
const errArr = []; const len = existence.length; if (len !== 0 && len - 1 !== existence[len - 1].index) { errArr.push(arr[0].id); } 复制代码
对比完成之后我们就可以通过判断 errArr
的长度来判断是否有错:
if(errArr.length > 0) { const errorMessage = `错误的地方有:${errArr.join(',')}` } 复制代码
所以整体代码是这样的:
// 定义方法 const verification = (arr) => { const errArr = []; arr = _.map(arr, (op, index) => ({ ...op, index, })); const existence = _.filter(arr, (op) => { return (op.code !== null) && op.code.trim() !== ''; }); const len = existence.length; if (len !== 0 && len - 1 !== existence[len - 1].index) { errArr.push(arr[0].id); } return errArr; } // 调用方法 const errArr = []; _.each(allArr, (arr) => { // 循环所有需要检测的元素 errArr = errArr.concat(verification(arr)); // 进行检测 }) if(errArr.length > 0) { const errorMessage = `错误的地方有:${errArr.join(',')}` } 复制代码
如此我们就完成了数据的校验,而且方法适用性很强,若是有四个或者更多需要检验的元素也可以使用,无需担心。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 算法之常见排序算法-冒泡排序、归并排序、快速排序
- 排序算法之冒泡排序改进算法
- 快速排序算法,C语言快速排序算法深入剖析
- 排序算法下——桶排序、计数排序和基数排序
- 数据结构和算法面试题系列—排序算法之快速排序
- 数据结构和算法面试题系列—排序算法之基础排序
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
生物信息学算法导论
N.C.琼斯 / 第1版 (2007年7月1日) / 2007-7 / 45.0
这是一本关于生物信息学算法和计算思想的导论性教科书,原著由国际上的权威学者撰写,经国内知名专家精心翻译为中文,系统介绍推动生物信息学不断进步的算法原理。全书强调的是算法中思想的运用,而不是对表面上并不相关的各类问题进行简单的堆砌。 体现了以下特色: 阐述生物学中的相关问题,涉及对问题的模型化处理并提供一种或多种解决方案: 简要介绍生物信息学领域领军人物; 饶有趣味的小插图使得概念更加具体和形象,方......一起来看看 《生物信息学算法导论》 这本书的介绍吧!