1.找出元素 item 在给定数组 arr 中的位置
function indexOf(arr, item) {
// 先判断当前浏览器是否支持 indexOf 方法
if (Array.prototype.indexOf){return arr.indexOf(item);
} else {for (var i = 0; i < arr.length; i++){if (arr[i] === item){return i;}
}
}
return -1; // 总是把 return - 1 暴漏在最外层
}
2.计算给定数组 arr 中所有元素的总和
2.1 普通玩家版
function sum(arr) {
let res = 0;
for(let i=0;i<arr.length;i++){res += arr[i];
}
return res;
}
2.2 forEach 版本
function sum(arr) {
let res = 0;
arr.forEach(function (curr,index,arr) {res += curr;});
return res;
}
console.log(sum([1, 2, 3, 4, 5])); //15
注意点:forEach() 为每个数组元素执行 callback 函数;不像 map() 或者 reduce(),它总是返回 undefined 值,并且不可链式调用。
function sum(arr) {
let res = 0;
arr.forEach(function (curr,index,arr) {return res += curr;});
}
console.log(sum([1, 2, 3, 4, 5])); // 返回 undefined
2.3 ES6 玩家版
function sum(arr) {return arr.reduce((prev,curr) => prev + curr,0)
}
// 调试部分
console.log(sum([1, 2, 3, 4])); //10
3.移除数组 arr 中的所有值与 item 相等的元素。不要直接修改数组 arr,结果返回新的数组
3.1 菜鸡(我写的) 版本
如果数组中的元素不和 item 相等,把数组元素添加到新的数组中
function remove(arr, item) {let res = [];
for(let i=0;i<arr.length;i++){if(arr[i] !== item){res.push(arr[i]);
}
}
return res;
}
3.2 菜鸡版本的另一种实现
如果数组中的元素和 item 相等,就不再往下执行代码
function remove(arr, item) {let res = [];
for(let i=0;i<arr.length;i++){if(arr[i] === item) continue;
res.push(arr[i]);
}
return res;
}
3.3 slice&splice 混用
- 题意要求不要直接修改数组 arr,结果返回新的数组;
slice()
方法可用于截取字符串,且返回的是截取内容(新的数组),我们可以传递参数 0 截取全部元素 - 不可以直接使用赋值的方式拷贝一个数组,会导致更改一个数组的元素另外一个数组也会跟着改变的情况
- 在新的数组上进行操作,利用
splice()
切割数组,splice()
会改变原数组
function remove(arr, item) {let newArr = arr.slice(0); //
for(let i=0;i<newArr.length;i++){if(newArr[i] === item){newArr.splice(i,1);
i--;
}
}
return newArr;
}
3.4 ES6 玩家版(别人写的)filter()
方法创建一个新的数组,新数组中的元素是通过检查指定数组中符合条件的所有元素。返回 返回 true 的项组成的数组
function remove(arr,item){return arr.filter(ele => ele !== item);
}
4.移除数组 arr 中的所有值与 item 相等的元素,直接在给定的 arr 数组上进行操作,并将结果返回
4.1 直接在给定的数组上操作,则可以使用splice()
方法,注意 splice()
方法删除元素后,数组长度也变化了,需要执行 i--
避免跳过元素。
function removeWithoutCopy(arr, item) {for(let i=0;i<arr.length;i++){if (arr[i] === item){arr.splice(i,1);
i--;
}
}
return arr;
}
4.2 倒着删除,不用考虑数组长度变化
function removeWithoutCopy(arr, item) {for(let i=arr.length-1;i>=0;i--){if(arr[i] === item){arr.splice(i,1);
}
}
return arr;
}