排序检测算法

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

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

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


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

查看所有标签

猜你喜欢:

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

Lighttpd

Lighttpd

Andre Bogus / Packt Publishing / 2008-10 / 39.99

This is your fast guide to getting started and getting inside the Lighttpd web server. Written from a developer's perspective, this book helps you understand Lighttpd, and get it set up as securely an......一起来看看 《Lighttpd》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

SHA 加密
SHA 加密

SHA 加密工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具