记录 - JS数组高阶函数使用

前言

✨✨ JavaScript的数组是一种特殊的对象 - 属于JavaScript 标准内置对象

数组是值的有序集合。每个值叫做一个元素,而每个元素在数组中有一个位置,以数字表示,称为索引
JavaScript 数组是无类型的: 数组元素可以是任意类型,并且同一个数组中的不同元素也可能有不同的类型。数组的元素甚至也可能是对象或其它数组,这允许创建复杂的数据结构,如:对象的数组,和数组的数组。


提示:以下主要记录开发过程中遇到常用的数组API,便于查找

🔥 一、forEach()

forEach() 方法 对数组的每个元素执行一次给定的函数。

语法: forEach(callbackFn , thisArg )

callbackFn :为数组中每个元素执行的函数。并会丢弃它的返回值。该函数被调用时将传入以下参数:

  element:数组中正在处理的当前元素。
  index:  数组中正在处理的当前元素的索引。
  array:  调用了 forEach() 的数组本身。

thisArr(可选) :执行 callbackFn 时用作 this 的值。

返回值: undefined
使用1:元素是原始类型,【不会】 改变原数组
let arr = [2, 4, 6];
let newArr = arr.forEach(function (element, index, array) {
   
  console.log("数组中正在处理的当前元素 : ", element);
  console.log("数组中正在处理的当前元素的索引 : ", index);
  console.log("调用了 forEach() 的数组本身 : ", array);
  element *= 2;
});
console.log("【newArr】= ", newArr);
console.log("【arr】= ", arr);

//  ******** 箭头函数简写 ******** //
let arr = [2, 4, 6];
let newArr = arr.forEach((element, index, array) => element *= 2);
console.log("【newArr】= ", newArr);
console.log("【arr】= ", arr);

打印如下:
在这里插入图片描述

使用2:元素是引用类型,【会】 改变原数组
let arr = [
  {
    name: "小明", age: 19 },
  {
    name: "丫丫", age: 18 },
  {
    name: "小红", age: 17 },
];
let newArr = arr.forEach((element, index, array) => element.age += 2);
console.log("【newArr】= ", newArr);
console.log("【arr】= ", arr);

打印如下:
在这里插入图片描述

说明:

forEach() 方法是一个迭代方法。它按索引升序地为数组中的每个元素调用一次提供的 callbackFn 函数。与 map() 不同,forEach() 总是返回 undefined而且不能继续链式调用其典型的用法是在链式调用的末尾执行某些操作

⚠️ 注意:!!!!!
(1)forEach() 对于空数组是不会执行回调函数的。
(2)除非抛出异常,否则没有办法停止或中断 forEach() 循环,它总是会将所有成员遍历完。如果希望符合 某个条件就中断循环,要使用for循环。

🔥 二、filter()

filter() 方法 用来筛选(过滤)数组中符合条件的元素,将符合条件的所有元素放入新数组中返回。

语法: filter(callbackFn , thisArg )

callbackFn :为数组中每个元素执行的函数。该函数返回 truefalse ,根据函数的返回值来确定哪些元素将保留在结果数组中。该函数被调用时将传入以下参数:

  element:数组中正在处理的当前元素。
  index:  数组中正在处理的当前元素的索引。
  array:  调用了 filter() 的数组本身。

thisArr(可选) :执行 callbackFn 时用作 this 的值。

返回值: 返回一个新数组,由通过提供的函数测试的元素组成。如果没有元素通过测试,则返回一个空数组。
使用1:元素是原始类型,【不会】 改变原数组
let arr = [1, 2, 3];
let newArr = arr.filter(function (element, index, array) {
   
  console.log("
  • 15
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我理解您的问题了。其实在ES5中的数组高阶函数本质上也是利用了原型的特性。不过在ES6中引入了箭头函数和更加简洁的语法,使得使用高阶函数更加方便。下面我将通过重构ES5中的数组高阶函数来展示如何利用原型的特性。 首先,我们来看一下ES5中的数组高阶函数的写法: ``` var arr = [1, 2, 3, 4, 5]; // map var newArr = arr.map(function(item) { return item * 2; }); // filter var filteredArr = arr.filter(function(item) { return item > 3; }); // reduce var reducedValue = arr.reduce(function(acc, item) { return acc + item; }, 0); ``` 现在我们来利用原型的特性,将这些高阶函数封装到数组的原型中: ``` Array.prototype.myMap = function(callback) { var newArr = []; for (var i = 0; i < this.length; i++) { newArr.push(callback(this[i], i, this)); } return newArr; }; Array.prototype.myFilter = function(callback) { var filteredArr = []; for (var i = 0; i < this.length; i++) { if (callback(this[i], i, this)) { filteredArr.push(this[i]); } } return filteredArr; }; Array.prototype.myReduce = function(callback, initValue) { var acc = initValue || this[0]; var startIndex = initValue ? 0 : 1; for (var i = startIndex; i < this.length; i++) { acc = callback(acc, this[i], i, this); } return acc; }; ``` 现在我们就可以像使用ES5中的数组方法一样来使用我们的自定义方法了: ``` var arr = [1, 2, 3, 4, 5]; // myMap var newArr = arr.myMap(function(item) { return item * 2; }); // myFilter var filteredArr = arr.myFilter(function(item) { return item > 3; }); // myReduce var reducedValue = arr.myReduce(function(acc, item) { return acc + item; }, 0); ``` 以上就是用原型的特性重构ES5中的数组高阶函数的方法。希望可以帮助到您!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值