DSAA Experience 5 How to Use DSAA in Node.js and JavaScript

怎样在Nodejs和JavaScript日常写代码中应用data structure and algorithms?

今天遇到一个问题,就是注册的时候,要填写5个字段,但这5个字段每一个都有多个验证方式,比如用户名不能有特殊字符,不能有空格,不能首字符是下划线等等。每一个字段如果验证不通过,你还要返回相应的错误信息,请问怎么解决?注意,这些验证,如果不通过,肯定是自由排列组合哦。

经过好几天的思索,尝试着用素数这个来解决,

思路其实比较简单,就是你每个验证,用三元符,如果结果你想要的,就是1,如果不想要,就设置为某个素数,比如2,3,5,7之类。

然后结果相乘,然后对乘积进行判断:

  • 如果是1,说明一切OK,全部验证通过;
  • 如果不是1,先看是不是属于这几个素数,如果是,那就直接返回对应的错误信息
  • 如果不是1,而且乘积也不在预先设定的范围内,就分解质因子,然后就对应出来了

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
const _ = require('lodash');

//预设一些不通过的原因,并设置key为素数
let map = new Map([
[2, "验证不通过,原因是xxxx"],
[3, "验证不通过,原因是xxxx"],
[5, "验证不通过,原因是xxxx"],
[7, "验证不通过,原因是xxxx"],
[11, "验证不通过,原因是xxxx"],
[13, "验证不通过,原因是xxxx"],
[17, "验证不通过,原因是xxxx"]
]);

//验证
let a = validator_a(args1) ? 1 : 2; //验证通过,就是1,不通过,就是某个素数
let b = validator_b(args2) ? 1 : 3;
let c = validator_c(args3) ? 1 : 5;
let d = validator_d(args4) ? 1 : 7;
let e = validator_e(args5) ? 1 : 11;
let f = validator_f(args6) ? 1 : 13;
let g = validator_g(args7) ? 1 : 17;

//验证结果进行乘积
let final = a * b * c * d * e * f * g;

//如果是1,说名一切OK,验证通过
if (final === 1){
return true;
}
//如果不是1
else {
//先看是不是在预设的结果里,如果是,说明就只有一个错误,给出这个错误即可
if (map.has(final)){
console.log(map.get(final));
return false;
}
else {
//如果不在预设的结果里,就分解质因数
let keys = [ ...map.keys()];
let errorMessage = [];
_.forEach(keys, (key)=>{
if (final % key === 0){ // 用%取余,如果是0,就说明是因子
errorMessage.push(map.get(final)); //取出对应的错误信息,push到msg里
}
});
console.log(errorMessage);
return false;
}

}
© 2018 awesome.js All Rights Reserved.
Theme by hiero