0

0

0

修罗

站点介绍

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

JS数组常见方法实现

修罗 2021-12-16 1644 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)


最新评论

  • 1

    1

  • 1

    1

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

    1

  • 1

    1

  • 1

    1

  • 1

    1

  • 1

    1

  • @@5Qa2D

    1

  • 1

    1

  • 1

    1

日历

2025年09月

 123456
78910111213
14151617181920
21222324252627
282930    

文章目录

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