实现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) // 15Array.isArray 实现
Array.myIsArray = function(o) {
return Object.prototype.toString.call(Object(o)) === '[object Array]';
};
// 测试
console.log(Array.myIsArray([])); // trueArray.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
Ценники на вывоз мусора сейчас космос, любые лайфхаки по экономии в тему.
1xbet onlayn kazino platforması ilə vaxtınızı daha səmərəli və maraqlı keçirin. Saytın canlı kazino bölməsi istifadəçilərə fərqli bir dünya təklif edir. Burada canlı dilerli kazino oyunlarının hər bir növünü sınaqdan keçirə bilərsiniz. Krupyelərin peşəkarlığı oyunun dinamikasını və marağını artırır. Müntəzəm olaraq yenilənən oyun siyahısı cansıxıcılığa yol vermir. Hesabınızı artırmaq üçün onlarla fərqli və etibarlı üsul mövcuddur. Qazanılan pullar cəmi bir neçə dəqiqə ərzində şəxsi hesabınıza köçürülür. Aktiv fəaliyyətinizə görə fərdi bonuslar və hədiyyələr qazana bilərsiniz. Dəstək xidməti həm çat, həm də e-poçt vasitəsilə kömək göstərir. 1xbet ailəsinə qoşulun və böyük uduşlar üçün ilk addımı atın. onlayn kazino
我一直梦想, 看到你们相册那样的地方。真棒。
我喜欢, 这里分享真实经验。你的项目 就是 属于这里的。请继续。
我热爱这样的想法, 去那么多国家。真的很鼓舞。
能感受到热爱。继续保持 感受。
我关注这样的资源, 写得很实在。你的网站 就是 属于这里的。加油。
1
1
1