手动实现 Array.prototype.map 方法
map() 方法创建一个新数组,其结果是该数组中的每个元素都调用一个提供的函数后返回的结果
function map(arr,callback){
// 检查传递的参数是否正确
if(!Array.isArray(arr) || !arr.length || typeof callback !== 'function'){
return [];
} else {
let result = [];
// 每次调用此函数时,都会创建一个 result 数组
// 因为不改变原始数组
for(let i = 0 ,len = arr.length; i < len ; i ++){
result.push( callback(arr[i],i,arr) );
}
return result;
}
}
手动实现Array.prototypr.filter 方法
filter() 方法创建一个新数组, 其包含通过所提供函数实现的测试的所有元素。
function filter(arr,callback){
// 检查传递的参数是否正确
if(!Array.isArray(arr) || !arr.length || typeof callback !== 'function'){
return [];
}else{
let result = [];
// 每次调用此函数时,都会创建一个 result 数组
// 因为不改变原始数组
for(let i = 0 , len = arr.length ; i < len ; i++){
// 检查 cllback 的返回值是否是真值
if( callback(arr[i],i,arr) ){
// 如果条件为真,则将数组元素 push 到 result 中
result.push( callback( arr[i], i ,arr));
}
}
return result;
}
}
手动实现Array.prototype.reduce方法
reduce() 方法对数组中的每个元素执行一个提供的reducer函数(升序执行),将其结果汇总为单个返回值。
function reduce( arr, callback ,initValue){
//检查输入参数是否正确
if(!Array.isArray(arr) || !arr.length || typeof callback !== 'function'){
return [];
}else{
// 如果没有将initValue传递给该函数,使用第一个数组项作为initValue
let hasInitValue = initValue !== undefined;
let value = hasInitValue ? initValue : arr[0];
// 如果有传递 initValue,则索引从 1 开始,否则从 0 开始
for (let i = hasInitValue ? 0 : 1, len = arr.length; i < len; i++) {
value = callback(value, arr[i], i, arr);
}
return value;
}
}