数组遍历方法及模拟底层实现

forEach

  • 注意: forEach 没有返回值,forEach循环无法停止(在其中加break无效),不改变原数组
const arr = [2,4,6,8,10]
arr.forEach((item, index) => {
	console.log(item, index)
})
2, 0
4, 1
6, 2
8, 3
10, 4
  • 底层实现:
Array.prototype.forEach = function(fn) {
	if (typeof fn !== 'function') {
		throw new TypeError(`${fn} must be an function`)
  }
  for (let i=0; i<this.length; i++) {
		fn(this[i], i)
	}
}

filter

  • 作用:筛选数据,筛选出数组中所有满足条件的元素项目,得到一个新数组,循环结束,返回新数组,不改变原数组
const todos = [2,4,6,7,8]
const arr1 = todos.filter(item => item > 5)
console.log(arr1)  // [6,7,8]
  • 底层实现:
Array.ptototype.filter = function(fn) {
	if (typeof fn !== 'function') {
		throw new TypeError(`${fn} must be an function`)
	}
  const newArr = []
  for (let i=0; i<this.length; i++) {
    fn(this[i]) && newArr.push(this[i])
  }
  return newArr
}

find

  • 作用: 遍历数组,找到符合条件的元素,不改变原数组
  • 注意: 找到第一个满足条件的元素,就返回,不再往后遍历。

 

const todos = [2,4,6,7,8]
const arr1 = todos.find(item => item > 5)
console.log(arr1)  // 6
  • 底层实现 
Array.prototype.find = function(fn) {
	if (typeof fn !== 'function') {
		throw new TypeError(`${fn} must be an function`)
	}
  for (let i=0; i<this.length; i++) {
		if (fn(this[i])) {
    	return this[i]
    }
	}
}

map

  • 作用: 根据源数据映射出一个新的数组(个数不变,但里面的元素内容可以定制),不改变原数组
const todos = [
  { id: 1, name: 'zhangsan', age: 10 },
  { id: 2, name: 'lisi', age: 15 }
]
const arr = todos.map((item) => {
	return item.name
})
console.log(arr)  // ['zhangsan', 'lisi']
  • 底层实现 
Array.prototype.map = function(fn) {
	if (typeof fn !== 'function') {
		throw new TypeError(`${fn} must be an function`)
	}
  let newArr = []
  for (let i=0; i<this.length; i++) {
		newArr.push(this[i])
	}
  return newArr
}

 some

  • 作用: 判断数组中是否有指定条件的元素不改变原数组
  • 注意: 返回一个布尔值
const arr = [2,4,6,8,10]
const flag = arr.some(item => item >5)
console.log(flag)  // true
  • 底层实现 
Array.prototype.some = function(fn) {
	if (typeof fn !== 'function') {
		throw new TypeError(`${fn} must be an function`)
	}
  for (let i=0; i<this.length; i++) {
  	if (fn(this[i])) {
			return true
		}
  }
  return false
}

 every 

  • 作用: 判断数组中所有元素是否满足指定条件(和some正好相反),不改变原数组
  • 注意:
    • 返回值为布尔值
    • 空数组遍历时,返回的就是true,因此当空数组遍历时需要做特殊处理
// 空数组的处理
const temArr = []
const flag = [].every(item => item.flag) 需严谨修改为
const flag = temArr.length ? temArr.every(item => item.flag) : false
const arr = [2,4,6,8]
const flag = arr.every(item => item > 5)
console.log(flag)  // false
  •  底层实现
Array.prototype.every = function(fn) {
	if (typeof fn !== 'function') {
		throw new TypeError(`${fn} must be an function`)
	}
  for (let i=0; i<this.length; i++) {
		if (!fn(this[i])) {
			return false
    }
	}
  return true
}

reduce

  • 作用: 数组中的元素累加起来求得一个最终结果,不改变原数组
  • 注意:
    • 第1个参数:累计器
    • 第2个参数:当前值
    • 第3个参数:当前索引
    • 第4个参数:源数组

           prev 是上一次的计算结果,第1次的值是你指定的初始值,之后都是上一次的结果

const todos = [2,4,6,8,10]
const result = arr.reduce(function (prev, item, index, origin) {
	return prev + item
}, 0)
console.log(result)  // 20
  • 底层实现
Array.prototype.reduce = function(reducer, initVal) {
	for (let i=0; i<this.length; i++) {
		initVal = reducer(initVal, this[i], i, this)
	}
  return initVal
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JS数组的reduce方法是用于对数组中的元素进行累积计算的方法。它接受一个回调函数作为参数,该回调函数可以接受四个参数:previousValue(上一次回调函数的返回值或者是初始值),currentValue(当前处理的元素),currentIndex(当前处理的元素的索引),array(原数组)。reduce方法会依次遍历数组中的每个元素,从第二个元素开始,将上一次回调函数的返回值作为下一次回调函数的previousValue参数,最后返回最终的累积结果。引用中的代码展示了一个使用reduce方法数组求和的例子,其中的箭头函数表示对previous和current进行相加的操作。中提到了JS内置的很多数组的迭代方法,其中就包括reduce方法。这些内置的方法可以提供更简洁、高效的代码实现,减少了我们手动编写循环的工作量。引用中的代码展示了使用filter方法数组进行过滤的例子。同样,filter方法底层实现也可以通过循环和条件判断来模拟。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [JavaScript数据结构【数组】](https://blog.csdn.net/Flying____fish/article/details/128169648)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值