首页 > 其他分享 >练习5:常见Array原型方法实现

练习5:常见Array原型方法实现

时间:2022-08-19 15:56:40浏览次数:86  
标签:function callbackfn 练习 len let new 原型 Array

Array.prototype.map

Array.prototype.map2 = function(callbackfn, thisArg) {
  if (this == null) {
    throw new TypeError('Cannot read property "map" of null or undefined')
  }
  // 因为类数组对象也可以调用map方法,[].map.call(arguments,...)
  // 所以需要转出数组
  let O = Object(this)
  // 这行确保len是非负数,并且可以把非数字转换成0
  let len = O.length >>> 0
  if (typeof callbackfn !== 'function') {
    throw new TypeError(callbackfn+'is not a function')
  }
  let T = thisArg
  let A = new Array(len)
  let k = 0
  while (k < len) {
    if (k in O) {
      let mappedValue = callbackfn.call(T,O[k],k,O)
      A[k] = mappedValue
    }
    k ++
  }
  return A
}

let arrMap = [1,2,3]

console.log(arrMap.map2(item => item + 1))

Array.prototype.filter

Array.prototype.filter2 = function(callbackfn, thisArg) {
  if (this == null) {
    throw new TypeError('Cannot read property "map" of null or undefined')
  }
  // 因为类数组对象也可以调用filter方法,[].filter.call(arguments,...)
  // 所以需要转出数组
  let O = Object(this)
  // 这行确保len是非负数,并且可以把非数字转换成0
  let len = O.length >>> 0
  if (typeof callbackfn !== 'function') {
    throw new TypeError(callbackfn+'is not a function')
  }
  let T = thisArg
  let A = new Array(len)
  let k = 0
  let to = 0
  while (k < len) {
    if (k in O) {
      if (callbackfn.call(T,O[k],k,O)) {
        A[to++] = O[k]
      }
    }
    k ++
  }
  A.length = to
  return A
}

let arrFilter = [1,2,3]

console.log(arrFilter.filter2(item => item >= 2))

Array.prototype.reduce

Array.prototype.reduce2 = function(callbackfn, initValue) {
  if (this == null) {
    throw new TypeError("Cannot read property 'reduce' of null or undefined");
  }
  if (typeof callbackfn !== 'function') {
    throw new TypeError(callbackfn + ' is not a function')
  }
  let O = Object(this), accu = 0, len = O.length >>> 0, k = 0
  if (initValue) {
    accu = initValue
  } else {
    if (len == 0) {
      throw new TypeError('Reduce of empty array with no initial value');
    }
    let kFlag = false
    while (!kFlag && (k < len)) {
      if (k in O) {
        kFlag = true
        accu = O[k]
      }
      k ++
    }
  }
  while (k < len) {
    if (k in O) {
      accu = callbackfn.call(undefined,accu, O[k],k,O)
    }
    k ++
  }
  return accu

}


arr = [1,2,3]
console.log(arr.reduce2((p,c) => { return p + c }))

Array.prototype.flat

// reduce + concat + 递归
function flat2(arr, d = 1) {
  return d > 0 ? arr.reduce((pre,curr) => pre.concat(Array.isArray(curr) ? flat2(curr,d-1) : curr), []) : arr.slice()
}
// 使用堆栈实现
function flat3(arr) {
  let stack = [...arr], res = []
  while(stack.length) {
    const next = stack.pop()
    if (Array.isArray(next)) {
      stack.push(...next)
    } else {
      res.push(next)
    }
  }
  return res.reverse()
}
Array.prototype.flat2 = function(d = 1) {
  return flat2(this,d)
}
Array.prototype.flat3 = function() {
  return flat3(this)
}

var arr1 = [1,2,3,[1,2,3,4, [2,3,4,[5]]]];
console.log(arr1.flat2(Infinity))
console.log(arr1.flat3())

标签:function,callbackfn,练习,len,let,new,原型,Array
From: https://www.cnblogs.com/xuweikang/p/16602246.html

相关文章

  • 练习7:函数记忆相关
    何为函数记忆函数记忆是指将上次的计算结果缓存起来,当下次调用时,如果遇到相同的参数,就直接返回缓存中的数据。常用于,复杂且有重复的计算。例如:斐波那契数列的计算under......
  • 练习8:最大公约数和最小公倍数问题
    最大公约数的计算,用到辗转相除法例如:求gcd(24,10),可以转换为gcd(10,4),然后是gcd(4,2),然后是(2,0),最好得出结果是2方法1:functiongcd(a,b){vartempif......
  • 第四章 2 数据类型-字符串 练习题
    第四章2数据类型-字符串练习题基础知识1\python语句"".join(list('hellowordld!'))的执行结果是:helloworld!#join()函数,是字符串内置的一个函数,在classstr下面a......
  • Random类、ArrayList类
    Random类什么是Random类此类的实例用于生成伪随机数。例如,以下代码使用户能够得到一个随机数:Randomr=newRandom();inti=r.nextInt();Random使用步骤......
  • php对很大的二维数组做去重和求差集操作:array_filter太慢,array_map配合array_diff速度
    需求:长度大约10万级别的二维数组,元素内数组长度10个左右(其实就是一个数据表的结果集合),根据指定字段对数据进行去重,最后要得到去重后被丢弃的数据明细。 两个关键过程:......
  • #10007. 「一本通 1.1 练习 3」线段
    #include<bits/stdc++.h>usingnamespacestd;structnode{ intl,r;};boolcmp(nodex,nodey){ returnx.r<y.r;}classSolution{ public: intsolve(vector......
  • MYSQL练习题(45题)
    建表语句--学生表StudentcreatetableStudent(SIdvarchar(10),Snamevarchar(10),Sagedatetime,Ssexvarchar(10));insertintoStudentvalues('01','赵雷',......
  • #10006. 「一本通 1.1 练习 2」数列分段
    #include<bits/stdc++.h>usingnamespacestd;classSolution{ public: intsolve(vector<int>num,intm) { intans=1,sum=0; for(inti=0;i<num.size(......
  • C++primer练习15.1-14
    练习15.1什么是虚成员?::需要派生类自己定义的成员练习15.2protected访问说明符与private有何区别?::protected允许派生类访问,private一律不允许访问练习15.3定义你自己的......
  • C++primer练习14.44-53
    练习14.44编写一个简单的桌面计算器使其处理二元计算doubleadd(doublea,doubleb){returna+b;}autosubtra=[](doublea,doubleb){returna-b;};stru......