描述
为数组 arr 中的每个元素求二次方。不要直接修改数组 arr,结果返回新的数组
示例
输入:[1, 2, 3, 4]
输出:[1, 4, 9, 16]
代码输入:
var arr = [1, 2, 3, 4, 5];
console.log(square(arr));
解法一:for遍历
这种方法对于有一定语言基础的人,可能是最容易想到的了,思路比较简单,直白。
第一种: for 遍历
function square(arr) {
var newArr = [];
for (var i = 0; i < arr.length; i++) {
newArr.push(arr[i] * arr[i]);
newArr[i] = Math.pow(arr[i],2);
}
return newArr;
}
解法二:利用 map 遍历
// 第二种:map 遍历
function square(arr) {
return arr.map(e => e*e)
}
解法三:利用 for Each遍历
// 第三种:forEach
function square(arr) {
var newArr = [];
arr.forEach(element => {
return newArr.push(element*element)
});
return newArr;
}
解法四:利用 for in 遍历
// 第四种: for in
function square(arr) {
var newArr = [];
for(let i in arr){
newArr.push(arr[i] * arr[i])
};
return newArr;
}
解法四:利用 for of 遍历
// 第五种: for of
function square(arr) {
var newArr = [];
for(let i of arr){
newArr.push(arr[i] * arr[i])
};
return newArr;
}
// 输出结果为:[ 4, 9, 16, 25, NaN ]
我接着就打印了数组长度以及循环 i ,
function square(arr) {
var newArr = [];
console.log(arr.length); // 5
for(let i of arr){
console.log(i); // 1 2 3 4 5
newArr.push(arr[i] * arr[i])
};
return newArr;
}
问题就显而易见了,for of 的循环是从 1 开始,我们需要的是从 0 开始的,改进方式:将 i 改写为 i - 1
function square(arr) {
var newArr = [];
for(let i of arr){
newArr.push(arr[i-1] * arr[i-1])
};
return newArr;
}
// 结果正确
总结
- 之前又一遍博客也讲述了循环的方式,提及了 in 与 of 的区别,但是理解的比较简单,也没有仔细比较他们的差别,今天这个题目对遍历有一个较为不错的对比 。
- 关于 in 与 of的用法,还是推荐对于数组(类数组)使用 in,对于对象使用 of,这么做也是根据他们索引值的起始值不同进行的区分。
- 想到了之前的一个面试题: in 与 of 的区别,当时解答说的是没啥区别,现在看来或许答案就在此处。
以上分享是我个人所学心得,仅供参考;
不当之处,欢迎大家指点、交流。