系列文章
- [ CodeWar ] - 001:过滤重复字符
- [ CodeWar ] - 002:最大和最小值
- [ CodeWar ] - 003:判断质数
- [ CodeWar ] - 004:处理数组元素
- [ CodeWar ] - 005:用户分组
- [ CodeWar ] - 006:数组比对
题目
需求:
- 对比传入的两个数组
- 如果 a 数组中每一个子项,在 b 数组中都能找到对应的平方(与顺序无关),则返回
true - 否则返回
false
解析
老规矩,先实现,后优化。
把这道题的思路稍微捋一下:
- 对 a, b 以相同规则进行排序
- 遍历数组,判断是否每一个子项都满足条件,如果有一个子项不满足则直接
return false - 遍历完成之后返回
true
function comp(array1, array2) {
let len, sortRule;
len = array1.length;
sortRule = (a, b) => a - b;
array1.sort(sortRule);
array2.sort(sortRule);
for (let i = 0; i < len; i++) {
if (Math.sqrt(array2[i]) !== array1[i]) {
return false;
}
}
return true;
}
优化
对于这种对比,我们其实可以转一下思路:
- 首先还是对 a, b 以相同排序规则排序
- 然后我们对 a 的每一个子项进行平方操作,生成一个新的 a 数组
- 将 a, b 转化成字符串,如果两个字符串相等,则满足条件
const comp = (a, b) =>
a
.map((i) => Math.pow(i, 2))
.sort()
.join() === b.sort().join();
当然,这里完全可以不适用排序来实现这个功能:
- 通过
Array.every遍历 a,判断其子项的平方是否在 b 中,返回这个结果即可
const comp = (a, b) => a.every((i) => b.includes(Math.pow(i, 2)));