0

0

0

修罗

站点介绍

只有了解事实才能获得真正的自由

JS数组常见方法实现

修罗 2021-12-16 1860 0条评论 JS

首页 / 正文

实现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

1639586977714.png

评论(0)


最新评论

  • https://www.studyglobus.com/author/carroll34a5552/

    Ценники на вывоз мусора сейчас космос, любые лайфхаки по экономии в тему.

  • Richardgrold

    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

    1

  • -1' OR 2+158-158-1=0+0+0+1 or 'TKCTZnRa'='

    1

日历

2026年07月

   1234
567891011
12131415161718
19202122232425
262728293031 

文章目录

推荐关键字: Linux webpack js 算法 MongoDB laravel JAVA jquery javase redis