原生JS手写every和some

为什么非要手写

之前写的一篇文章,比较两个数组内容是否一致,其中就用到了every和some方法,都是ES6数组的迭代方法;

虽然现成的方法用起来爽,但是内部的原理到底是什么,看似简单的方法究竟是如何实现的?

所以如果能自己写一下,好处有:
1、彻彻底底弄明白实现原理和思路
2、巩固自己的原生JS基础
3、给别人装逼,显得自己很专业

自己实现every

先看ES6中的every用法,遍历列表,每一项都符合条件则返回true,否则返回false
例如:

1
2
3
const list = [1,2,3,4,5]
const result = list.every(it => it >= 1)
console.log(result) //每一项>=1都是成立的,返回true

思路:
1、遍历
2、遍历的每一项,都需要符合条件

手写实现的具体代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/**
* @description: 数组检查,判断每一项是否都符合条件
* @params arrList:数组
* @params conditionFn:判断条件函数
* @return true:每一项都符合条件 false:至少有一项不符合条件
*/
const myEveryFn = (arrList, conditionFn) => {
let res = true //初始默认结果为true

for (let i = 0; i < arrList.length; i++){
if (!conditionFn(arrList[i])) {
console.log('出现了不符合条件的')
res = false
break //跳出循环
}
}

return res
}

自己手写的方法,更加完善的判断、错误异常提醒就暂时不做了,只实现逻辑思路;

可以看到,第一个参数传入一个数组,第二个参数实际是一个判断条件的函数,数组的单独每一项传进去校验,条件函数给出结果;

可以看出我写的,遍历过程中,只要出现了不符合条件的,最终结果直接置为false,break打断循环,直接输出最终结果,节约性能(因为只要有一个不符合,后面的都不用看了)。

原型对象写法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Array.prototype.myEvery = function (conditionFn) {
//...省略各种错误判断,只写实现逻辑

const list = this
let res = true //初始默认结果为true

for (let i = 0; i < list.length; i++){
if (!conditionFn(list[i])) {
console.log('出现了不符合条件的')
res = false
break //跳出循环
}
}

return res
}

自己实现some

和之前的every同样的思路和道理,遍历过程中,只要有一项符合条件,最终结果直接置为true,后面的同样也不用看了,直接跳出循环节约性能。

手写实现的具体代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/**
* @description: 数组检查,判断至少有一项符合条件
* @params arrList:数组
* @params conditionFn:判断条件函数
* @return true:至少有一项符合条件 false:全部不符合条件
*/
const mySomeFn = (arrList, conditionFn) => {
let res = false //初始默认结果为false

for (let i = 0; i < arrList.length; i++){
if (conditionFn(arrList[i])) {
console.log('出现了符合条件的!')
res = true
break //跳出循环
}
}

return res
}

原型对象写法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Array.prototype.mySome = function (conditionFn) {
//...省略各种错误判断,只写实现逻辑

const list = this
let res = false

for (let i = 0; i < list.length; i++){
if (conditionFn(list[i])) {
console.log('出现了符合条件的!')
res = true
break //跳出循环
}
}

return res
}

总结

其实就是最基础的遍历,再加上一个条件函数,就能完成;
包括ES6数组的其它迭代方法,像find、filter等,最终只是返回的结果不同而已,过程都是同样的思路和逻辑。


原生JS手写every和some
https://liujiaweb.cn/posts/13875.html
作者
Liu Jia
发布于
2021年2月2日
许可协议