JavaScript手写数组的常用函数总结

接下来我将从以下三个方面详细讲解“JavaScript手写数组的常用函数总结”的完整攻略:

  1. 常用函数列表
  2. 函数的实现
  3. 示例说明

1. 常用函数列表

下面是JavaScript手写数组的常用函数列表,包括函数名称、参数和作用:

函数名称 参数 作用
push element 在数组末尾添加一个元素并返回新的长度
pop 删除数组末尾的元素并返回该元素
shift 删除数组开头的元素并返回该元素
unshift element 在数组开头添加一个元素并返回新的长度
splice index, num, element1, element2, ... 在指定位置插入/删除元素并返回被删除的元素组成的新数组
concat array1, array2, ... 连接多个数组并返回合并后的新数组
slice start, end 从指定位置截取数组并返回新的数组
map callback 根据回调函数处理每个元素并返回新的修改后的数组
filter callback 根据回调函数过滤出符合条件的元素并返回新的数组
reduce callback, initValue 根据回调函数对数组元素进行归纳计算并返回计算结果

2. 函数的实现

接下来我们对这些常用函数进行手写实现。

push

Array.prototype.push1 = function(...args) {
  for (let i = 0; i < args.length; i++) {
    this[this.length] = args[i];
  }
  return this.length;
}

pop

Array.prototype.pop1 = function() {
  if (this.length === 0) return undefined;
  const res = this[this.length - 1];
  delete this[this.length - 1];
  this.length--;
  return res;
}

shift

Array.prototype.shift1 = function() {
  if (this.length === 0) return undefined;
  const res = this[0];
  for (let i = 0; i < this.length - 1; i++) {
    this[i] = this[i+1];
  }
  delete this[this.length - 1];
  this.length--;
  return res;
}

unshift

Array.prototype.unshift1 = function(...args) {
  const newLength = args.length + this.length;
  for (let i = newLength - 1; i >= args.length; i--) {
    this[i] = this[i - args.length];
  }
  for (let i = 0; i < args.length; i++) {
    this[i] = args[i];
  }
  return newLength;
}

splice

Array.prototype.splice1 = function(start, num, ...args) {
  let res = [];
  const deleteCount = Math.min(num, this.length - start);
  for (let i = start; i < start + deleteCount; i++ ) {
    res.push(this[i]);
    delete this[i];
  }
  for (let i = this.length - 1; i >= start + deleteCount; i--) {
    this[i + args.length - deleteCount] = this[i];
  }
  for (let i = 0; i < args.length; i++) {
    this[start + i] = args[i];
  }
  this.length = this.length - deleteCount + args.length;
  return res;
}

concat

Array.prototype.concat1 = function(...args) {
  const res = [];
  for (let i = 0; i < this.length; i++) {
    res.push(this[i]);
  }
  for (let i = 0; i < args.length; i++) {
    if (Array.isArray(args[i])) {
      for (let j = 0; j < args[i].length; j++) {
        res.push(args[i][j]);
      }
    } else {
      res.push(args[i]);
    }
  }
  return res;
}

slice

Array.prototype.slice1 = function(start, end) {
  const res = [];
  const startIndex = start >= 0 ? start : Math.max(this.length + start, 0);
  const endIndex = end ? end : this.length;
  for (let i = startIndex; i < endIndex; i++) {
    res.push(this[i]);
  }
  return res;
}

map

Array.prototype.map1 = function(callback) {
  const res = [];
  for (let i = 0; i < this.length; i++) {
    res.push(callback(this[i], i, this));
  }
  return res;
}

filter

Array.prototype.filter1 = function(callback) {
  const res = [];
  for (let i = 0; i < this.length; i++) {
    if (callback(this[i], i, this)) {
      res.push(this[i]);
    }
  }
  return res;
}

reduce

Array.prototype.reduce1 = function(callback, initValue) {
  let res = initValue !== undefined ? initValue : this[0];
  let startIndex = initValue !== undefined ? 0 : 1;
  for (let i = startIndex; i < this.length; i++) {
    res = callback(res, this[i], i, this);
  }
  return res;
}

3. 示例说明

下面是两个手写数组函数的示例说明:

例子1:手写一个数组扁平化函数

function flatten(arr) {
  return arr.reduce1((prev, cur) => {
    return prev.concat(Array.isArray(cur) ? flatten(cur) : [cur]);
  }, []);
}

console.log(flatten([1, 2, [3, 4], [5, [6, 7]]])); // [1, 2, 3, 4, 5, 6, 7]

例子2:手写一个过滤偶数的数组函数

function filterEven(arr) {
  return arr.filter1(item => item % 2 === 0);
}

console.log(filterEven([1, 2, 3, 4, 5, 6])); // [2, 4, 6]

至此,“JavaScript手写数组的常用函数总结”的完整攻略就讲解完了,希望能对大家有所帮助!

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript手写数组的常用函数总结 - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • 使用JS读取XML文件的方法

    使用JS读取XML文件的方法可以分为以下步骤: 创建XMLHttpRequest对象 通过XMLHttpRequest对象发送HTTP请求来获取XML文件 解析XML文件 下面我将详细介绍这三个步骤,并提供两个使用示例。 步骤1:创建XMLHttpRequest对象 使用XMLHttpRequest对象是读取XML文件的标准方式之一。我们可以通过下面的代码创…

    JavaScript 2023年5月27日
    00
  • Android开发中使用WebView控件浏览网页的方法详解

    Android开发中使用WebView控件浏览网页的方法详解 为什么要用WebView? 在Android应用程序中,使用WebView组件可以使我们的应用程序直接显示网页内容。实际上,WebView是最常用的界面控件之一,因为在Android平台上许多应用程序都需要能够直接调用Web内容,并能方便地浏览它。 如何使用WebView? 1. 添加权限 在An…

    JavaScript 2023年6月11日
    00
  • JS获取屏幕高度的简单实现代码

    当我们需要获取浏览器窗口可视区域的高度时,可以使用JavaScript代码来实现。下面是获取屏幕高度的简单实现代码攻略: 1.通过window对象获取屏幕高度 我们可以通过window对象来获取浏览器窗口的高度。这里有一个简单的例子: var height = window.innerHeight; 其中,window.innerHeight属性用于获取浏览…

    JavaScript 2023年6月11日
    00
  • 用javascript对一个json数组深度赋值示例

    为了对一个JSON数组进行深度赋值,我们可以使用递归的方法来完成。下面是详细步骤: 首先,需要定义一个递归函数,该函数可以接受3个参数:一个JSON对象、一个数组索引和一个要分配的值。代码如下: function setValue(obj, path, value) { if (typeof path === ‘string’) path = path.sp…

    JavaScript 2023年5月27日
    00
  • html5 web本地存储将取代我们的cookie

    HTML5 Web本地存储指的是一种在客户端(浏览器)端进行数据存储的技术。它主要通过Web Storage API和IndexedDB API来实现。 与传统的Cookie相比,Web本地存储有诸多优点。例如,Web本地存储提供了比Cookie更大的存储空间,并且数据存储在本地,不需要每次请求都带上一份数据,从而减少了网络流量。 以下是使用Web本地存储来…

    JavaScript 2023年6月11日
    00
  • 前端JavaScript中的反射和代理

    首先简单介绍一下“前端JavaScript中的反射和代理”是什么意思。JavaScript中的反射和代理主要是针对对象进行操作,反射是指通过内置的API获取对象的属性和方法来进行操作,而代理则是指创建一个中间层来修改对象的行为和属性。 接下来分别详细介绍反射和代理,并提供两个示例说明。 反射 获取对象的属性和方法 在JavaScript中,我们可以使用内置的…

    JavaScript 2023年6月11日
    00
  • javascript 进阶篇1 正则表达式,cookie管理,userData

    JavaScript 进阶篇1:正则表达式、Cookie 管理、UserData 1. 正则表达式 正则表达式在 JavaScript 开发中非常重要,是处理字符串的得力工具。以下是一些基本概念和正则表达式在 JavaScript 中的应用。 基本概念 匹配模式:正则表达式在搜索时所用的模式 字符串搜索:在文本中搜索匹配模式并返回匹配结果 模式修饰符:使用标…

    JavaScript 2023年6月11日
    00
  • js前端解决跨域问题的8种方案(最新最全)

    下面我就来详细讲解“js前端解决跨域问题的8种方案(最新最全)”的完整攻略。 一、什么是跨域问题 在讲解跨域问题解决方案之前,我们先来了解一下什么是跨域问题。简单来说,跨域问题就是当一个页面通过ajax向其他域名下的服务器请求资源时,就会发生跨域问题。这时候就需要解决跨域问题,否则会引起一系列问题。 二、为什么会产生跨域问题 跨域问题是由于浏览器的同源策略导…

    JavaScript 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部