实现forEach方法
Array.prototype.myForEach = function(callback, context = window) {
// this => arr
let self = this,
i = 0,
len = self.length;
for(;i < len;i++) {
typeof callback == 'function' && callback.call(context,self[i], i)
}
}
// 测试
var users = [
{id: 1, name: '张三'},
{id: 2, name: '张三'},
{id: 3, name: '张三'},
{id: 4, name: '张三'}
]
users.myForEach((v,i) => { console.log(v, i) })
/*
{id: 1, name: "张三"} 0
{id: 2, name: "张三"} 1
{id: 3, name: "张三"} 2
{id: 4, name: "张三"} 3
*/
实现filter方法
Array.prototype.myFilter = function(callback, context=window){
let len = this.length
newArr = [],
i = 0
for(; i < len; i++){
if(callback.apply(context, [this[i], i , this])){
newArr.push(this[i]);
}
}
return newArr;
}
// 测试
var users = [
{id: 1, name: '张三'},
{id: 2, name: '张三'},
{id: 3, name: '张三'},
{id: 4, name: '张三'}
]
var usersFilter = users.myFilter((v,i) => v.id >= 3)
console.log(usersFilter)
// [{id: 3, name: "张三"}, {id: 4, name: "张三"}]
实现map方法
- 回调函数的参数有哪些,返回值如何处理
- 不修改原来的数组
Array.prototype.myMap = function(callback, context){
// 转换类数组
var arr = Array.prototype.slice.call(this),//由于是ES5所以就不用...展开符了
mappedArr = [],
i = 0;
for (; i < arr.length; i++ ){
// 把当前值、索引、当前数组返回去。调用的时候传到函数参数中 [1,2,3,4].map((curr,index,arr))
mappedArr.push(callback.call(context, arr[i], i, this));
}
return mappedArr;
}
// 测试
var users = [
{id: 1, name: '张三'},
{id: 2, name: '张三'},
{id: 3, name: '张三'},
{id: 4, name: '张三'}
]
var usersMap = users.myMap((v,i) => ({id: v.id + 1, name: v.name}))
console.log(usersMap)
/*
0: {id: 2, name: "张三"}
1: {id: 3, name: "张三"}
2: {id: 4, name: "张三"}
3: {id: 5, name: "张三"}
*/
实现reduce方法
- 初始值不传怎么处理
- 回调函数的参数有哪些,返回值如何处理。
Array.prototype.myReduce = function(fn, initialValue) {
var arr = Array.prototype.slice.call(this);
var res, startIndex;
res = initialValue ? initialValue : arr[0]; // 不传默认取数组第一项
startIndex = initialValue ? 0 : 1;
for(var i = startIndex; i < arr.length; i++) {
// 把初始值、当前值、索引、当前数组返回去。调用的时候传到函数参数中 [1,2,3,4].reduce((initVal,curr,index,arr))
res = fn.call(null, res, arr[i], i, this);
}
return res;
}
// 测试数组元素相加
var arr = [1, 2, 4, 8]
var total = arr.myReduce((pre, next) => pre + next)
console.log(total) // 15
Array.isArray 实现
Array.myIsArray = function(o) {
return Object.prototype.toString.call(Object(o)) === '[object Array]';
};
// 测试
console.log(Array.myIsArray([])); // true
Array.of 实现
Array.of()
方法用于将一组值,转换为数组
- 这个方法的主要目的,是弥补数组构造函数
Array()
的不足。因为参数个数的不同,会导致Array()
的行为有差异。 Array.of()
基本上可以用来替代Array()
或new Array()
,并且不存在由于参数不同而导致的重载。它的行为非常统一
Array.of(3, 11, 8) // [3,11,8]
Array.of(3) // [3]
Array.of(3).length // 1
实现
function ArrayOf(){
return [].slice.call(arguments);
}
find实现
find
接收一个方法作为参数,方法内部返回一个条件find
会遍历所有的元素,执行你给定的带有条件返回值的函数- 符合该条件的元素会作为 find 方法的返回值
- 如果遍历结束还没有符合该条件的元素,则返回
undefined
Array.prototype.myFind = function (callback) {
// var callback = function (item, index) { return item.id === 4 }
for (var i = 0; i < this.length; i++) {
if (callback(this[i], i)) {
return this[i]
}
}
}
// 测试
var users = [
{id: 1, name: '张三'},
{id: 2, name: '张三'},
{id: 3, name: '张三'},
{id: 4, name: '张三'}
]
var ret = users.myFind(function (item, index) {
return item.id === 2
})
console.log(ret) // {id: 2, name: "张三"}
findIndex实现
Array.prototype.myFindIndex = function (callback) {
// var callback = function (item, index) { return item.id === 4 }
for (var i = 0; i < this.length; i++) {
if (callback(this[i], i)) {
// 这里返回
return i
}
}
}
// 测试
var users = [
{id: 1, name: '张三'},
{id: 2, name: '张三'},
{id: 3, name: '张三'},
{id: 4, name: '张三'}
]
var ret = users.myFindIndex(function (item, index) {
return item.id === 2
})
console.log(ret) // 1
实现every方法
Array.prototype.myEvery = function(callback, context = window){
var len = this.length,
flag = true,
i = 0;
for(;i < len; i++){
// 一个回调执行返回false则执行完毕返回false
if(!callback.apply(context,[this[i], i , this])){
flag = false;
break;
}
}
return flag;
}
// 测试
var arr = [{ num: 1 }]
var aa = arr.myEvery(function(v, index, arr){
return v.num >= 12;
}, arr)
console.log(aa) // false
实现some方法
Array.prototype.mySome = function(callback, context = window){
var len = this.length,
flag = false,
i = 0;
for(;i < len; i++){
// 一个回调执行返回true则执行完毕返回true
if(callback.apply(context, [this[i], i , this])){
flag = true;
break;
}
}
return flag;
}
// 测试
var arr = [{ num: 13 }]
var flag = arr.mySome((v,index,arr) => v.num >= 10, obj)
console.log(flag); // true
1
1
1
1
1
1
1
1
1
1