博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
排序检测算法
阅读量:6253 次
发布时间:2019-06-22

本文共 2057 字,大约阅读时间需要 6 分钟。

时间: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(',')}`}

如此我们就完成了数据的校验,而且方法适用性很强,若是有四个或者更多需要检验的元素也可以使用,无需担心。

转载地址:http://vzfsa.baihongyu.com/

你可能感兴趣的文章
php中的$this-%3efetch,Zend DB fetchAll(): where子句數組帶有IN操作符
查看>>
李思琼php,nginx单机1w并发优化
查看>>
怎么手动设置oracle,手把手设置win7系统手动启动Oracle服务的设置方法
查看>>
oracle fk作用,oracle pk&fk
查看>>
oracle裂块是什么意思,Oracle索引块分裂split信息汇总
查看>>
php构造函数创建对象,7.10 构造函数来创建对象
查看>>
oracle解密后台包,oracle9i加密解密包用法
查看>>
oracle数据库nmon日志在哪,oracle技术之nmon使用说明
查看>>
oracle10g实例修改表空间,oracle10g建表空间和修改oracle字符和删除表空间和用户(加 标注)...
查看>>
linux命令语法规则,Linux系统tar命令怎么使用语法规则
查看>>
linux查看服务器静态路由配置,配置Linux静态路由和配置IP
查看>>
linux应用程序使用时钟中断,Linux时钟中断(2.6.23)(三)
查看>>
win7读取linux硬盘序列号,Windows 下获取硬盘序列号
查看>>
linux音频设备接口,OSS--跨平台的音频接口简介
查看>>
华为网卡linux驱动安装,Linux Nvidia显卡驱动安装
查看>>
linux sql撤销,取消请求的sql语句
查看>>
c语言学习 二维指针,二维数组和指针(C语言)
查看>>
图像压缩算法构造最优解c语言,C语言与程序设计第12章递归.ppt
查看>>
c语言飞机源代码,C语言写的飞机源码
查看>>
C语言 如果某个数大于10 归零,C:当指针实际指向某个东西时,函数继续接收归零指针(示例代码)...
查看>>