排序检测算法

2018-11-15 admin

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

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

原文链接:https://segmentfault.com/a/1190000017022861

本站文章除注明转载外,均为本站原创或编译。欢迎任何形式的转载,但请务必注明出处。

转载请注明:文章转载自 JavaScript中文网 [https://www.javascriptcn.com]

本文地址:https://www.javascriptcn.com/read-45557.html

文章标题:排序检测算法

相关文章
javascript实现Table排序的方法
本文实例讲述了javascript实现Table排序的方法。分享给大家供大家参考。具体实现方法如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML ...
2017-03-23
javascript检测两个数组是否相似
JS要比较两个数组是否有相同的元素,即两个数组所有元素都相同,但元素的顺序不一定一致。只就需要先将数组进行排序,再比较两个数组是否相等。 <!DOCTYPE html PUBLIC "-//W3C&#x2...
2017-03-23
JavaScript 常见安全漏洞和自动化检测技术
前言 随着 Web2.0 的发展以及 Ajax 框架的普及,富客户端 Web 应用(Rich Internet Applications,RIA)日益增多,越来越多的逻辑已经开始从服务器端转移至客户端,这些逻辑通常都是使用 JavaScri...
2017-03-29
JavaScript中用sort()方法对数组元素进行排序的操作
JavaScript数组sort()方法排序数组的元素。 语法 array.sort( compareFunction ); 下面是参数的详细信息: compareFunction : 指定一个函数,定义排序次序。如果省略,数组字典顺序...
2017-03-24
js表格排序实例分析(支持int,float,date,string四种数据类型)
本文实例讲述了js表格排序的方法。分享给大家供大家参考。具体如下: <html> <head> <title>SortTable2</title> <meta http-equ...
2017-03-23
JavaScript检测鼠标移动方向的方法
本文实例讲述了JavaScript检测鼠标移动方向的方法。分享给大家供大家参考。具体实现方法如下: function Start() { stage.addEventListener(MouseEvent.MOUSE_MOVE, Che...
2017-03-23
Javascript 数组排序详解
如果你接触javascript有一段时间了,你肯定知道数组排序函数sort,sort是array原型中的一个方法,即array.prototype.sort(),sort(compareFunction),其中compareFunction...
2017-03-27
js检测判断日期大于多少天的方法
本文实例讲述了js检测判断日期大于多少天的方法。分享给大家供大家参考。具体分析如下: 这个例子演示如何使用js根据标签span中的日期来对比本地时间(访问者电脑上的时间,或者标准时间),如相差15天: <!DOCTYPE html&g...
2017-03-23
JavaScript中数据结构与算法(四):串(BF)
串是由零个或多个字符组成的有限序列,又叫做字符串 串的逻辑结构和线性表很相似的,不同的是串针对是是字符集,所以在操作上与线性表还是有很大区别的。线性表更关注的是单个元素的操作CURD,串则是关注查找子串的位置,替换等操作。 当然不同的高级语...
2017-03-25
JavaScript SHA512&SHA256加密算法详解
JavaScript SHA512加密算法详细代码 /* * A JavaScript implementation of the Secure Hash Algorithm, SHA-512, as defined * in...
2017-03-29
回到顶部