需求描述
需要在app中做一个答题的功能,题目和选项后端随机传过来,所以选择判断题的分数需要前端计算,后端说自己不好算。 选项和答案都是数组,用户的答案也是以数组的形式保存的。
选项格式示例: "examinationAnswers":["1","bB","FDS","FDSFDS"]
正确答案实例: "rightAnswer":["1"]
用户答案实例: "userAnswer":["1"]
我的做法
其实就是对比一下两个数组,但是由于有多选题且用户点击顺序不确定,所以不能直接用 “===”来直接对比用户答案和正确答案。 我的思路如下:
第一步:判断两个参数是否都是数组格式,划重点 typeofe 是无法准确检测数组的,对于前端而言,我们用到的所谓数组,其本质是一种特殊的对象,所以检验这个数组要用 intanceof 方法
js中可以通过typeof操作符和instanceof操作符判断变量的类型。
而typeof在判断基本类型的变量时能精准判断。当变量是数组、对象时都只会返回‘object',无法准确的说明该对象是什么类型的。
但是instanceof基于原型链可以判断一个引用是否属于某构造函数。能弥补typeof 方法判断变量类型的缺点。
第二步,判断两个数组的长度
第三步,判断是否A的每一项都在B中
第四步,根据题型计算分数
arrCompare(a, b) {
// 是否都为数组
console.log('是否都为数组', a instanceof Array, b instanceof Array);
console.log('判断长度是否一样', a.length, b.length);
// 判断长度是否一样
if (a.length != b.length) {
return false;
}
var aStr = a.toString();
// B的每一项是否都在A中
for (var i = 0, len = b.length; i < len; i++) {
if (aStr.indexOf(b[i]) == -1) return false;
console.log('B的每一项是否都在A中', aStr.indexOf(b[i]) == -1);
}
return true;
},arrCompare(a, b) {
// 是否都为数组
console.log('是否都为数组', a instanceof Array, b instanceof Array);
console.log('判断长度是否一样', a.length, b.length);
if (!(a instanceof Array) || !(b instanceof Array)) {
return false;
}
// 判断长度是否一样
if (a.length != b.length) {
return false;
}
var aStr = a.toString();
// B的每一项是否都在A中
for (var i = 0, len = b.length; i < len; i++) {
if (aStr.indexOf(b[i]) == -1) return false;
console.log('B的每一项是否都在A中', aStr.indexOf(b[i]) == -1);
}
return true;
},
写完了,在浏览器中测试了一下,没有发现问题。然后打包部署交给测试了,结果测试小姐姐告诉我,不管填的答案对不对,分数一直都是0 。
完了!一个一级阻塞性bug
发现问题
于是连上手机开始调试,我将每一步的值都输出发现,在app中instanceof判断数组竟然全是false,离了个大谱。终于找到原因了,如下图
谨以此纪念一下踩的坑