排序检测算法

栏目: 编程工具 · 发布时间: 5年前

内容简介:时间: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(',')}`
}
复制代码

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


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

别具光芒

别具光芒

李烨 / 2008-10 / 59.00元

《别具光芒CSS属性、浏览器兼容与网页布局》结合大量范例与实际应用的实例,详细介绍了W3C发布的层叠样式表CSS2.1规范,浏览器对于CSS2.1规范解释的异同,以及使用XHTML和层叠样式表对网页进行结构化与美化的实际制作方法。《别具光芒CSS属性、浏览器兼容与网页布局》内容由浅入深,不仅介绍了Web标准和层叠样式表的各个属性,还结合实例对属性的实际应用进行讲解,同时配合在不同浏览器内的效果展示......一起来看看 《别具光芒》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

在线进制转换器
在线进制转换器

各进制数互转换器

URL 编码/解码
URL 编码/解码

URL 编码/解码