最有用的 JavaScript 数组函数——第 1 部分
在本文中,我们将讨论以下两个 JavaScript 数组函数。这两个函数都在工业中广泛使用,使 JavaScript 代码干净、模块化、易于理解。
- Array.prototype.every()
- Array.prototype.some()
Array.prototype.every():当您需要验证给定数组的每个元素时使用此函数。它接受一个回调函数作为为数组的每个元素调用的参数。回调函数必须返回 true 或 false。如果数组的所有元素都满足验证函数,因此回调函数对数组的所有元素都返回 true,那么它返回 true。否则,一旦遇到不满足验证器函数的第一个元素,它就会返回 false。
句法:
arr.every(callback(element[, index[, array]])[, thisArg])
参数:该函数接受上面提到的五个参数,如下所述:
- callback:此参数保存要为数组的每个元素调用的函数。
- currentValue:该参数保存当前正在处理的元素的值。
- index:该参数是可选的,它保存从0开始的数组中currentValue元素的索引。
- array:这个参数是可选的,它保存了调用 Array.every 的完整数组。
- thisArg:此参数是可选的,它保存要作为 this 传递的上下文,以便在执行回调函数时使用。如果传递了上下文,则每次调用回调函数时都将其用作this ,否则将使用 undefined 作为默认值。
示例:给定一个数组,编写一个函数来检查该数组的所有元素是否小于 100。
- 程序 1:在这段代码中,我们将使用循环函数检查数组。所以天真的方法是使用如下所示的循环。
尽管对于任何新手程序员来说,下面的实现都很容易理解,但程序员必须注意一些不必要的检查。例如,短路机制,即程序员必须明确确保一旦循环遇到第一个不符合给定条件的元素,循环应该中断并返回假。此外,除非程序员深入研究代码的逻辑,否则他/她将无法理解这个 for 循环在做什么。
let numbers = [30,60,190]; let result = true; for (let i = 0; i < numbers.length; i++) { if (numbers[i] >= 100) { result = false; break; } } document.write(result);
输出:
false
- 程序 2:在这段代码中,我们将使用Array.prototype.every()函数检查数组。所以天真的方法是使用如下所示的循环。
通过使用Array.every() ,可以使用更清晰、直观和更少的代码来实现相同的行为。
let numbers = [30,60,90]; let result = numbers.every(function(element){ return(element < 100); }); document.write(result);
输出:
true
示例:给定一个数组,编写一个函数来检查该数组的所有元素是否都属于指定的数据类型。
- 程序 1:再次天真的方法是使用 for 循环遍历数组。此代码片段与上一个示例具有相同的漏洞。
function fnCheckDatatype_Every(arr, sDatatype){ for(var i = 0 ; i < arr.length; i ++) { if(typeof(arr[i]) !== sDatatype) { return false; } } } fnCheckDatatype_Every(["Geeks",4,"Geeks"],"string"); fnCheckDatatype_Every(["Geeks","for","Geeks"],"string");
true false
- 程序 2:使用 arr.Every() 这些漏洞在下面的代码片段中再次得到处理。下面代码片段中要注意的另一点是我们将两个参数传递给 array.every()函数。第一个是回调函数(在我们的例子中是匿名函数),第二个是 sDatatype。因为我们在每次调用回调函数时都需要一个外部变量,所以我们将它作为第二个参数作为“this”变量传递。
function fnCheckDatatype_Every(arr, sDatatype){ return arr.every(function(element){ return typeof(element) === sDatatype; },sDatatype); } fnCheckDatatype_Every(["Geeks","for","Geeks"],"string"); fnCheckDatatype_Every(["Geeks",4,"Geeks"],"string");
输出:
true false
Array.prototype.some():这与Array.every()相反。当您需要检查给定数组的至少一个元素是否通过了回调函数。 Array.some() 接受一个回调函数作为参数,它必须返回一个真或假。为数组的每个元素调用回调函数,直到它为数组的至少一个元素返回 true。如果数组中没有一个元素通过回调函数的测试,则返回false。
句法:
arr.some(callback(element[, index[, array]])[, thisArg])
参数:此函数接受四个参数,如上所述,如下所述:
- callback:此参数保存要为数组的每个元素调用的函数。
- currentValue:该参数保存当前正在处理的元素的值。
- index:该参数是可选的,它保存从0开始的数组中currentValue元素的索引。
- array:这个参数是可选的,它保存了调用 Array.every 的完整数组。
- thisArg此参数是可选的,它保存要作为 this 传递的上下文,以便在执行回调函数时使用。如果传递了上下文,则每次调用回调函数时都将其用作this ,否则将使用 undefined 作为默认值。
示例:给定一个数组,编写一个函数来检查一个数组是否包含任何大于 100 的数字。
- 程序 1:朴素的方法
function fnIsGreaterThan100_loop(arr){ for(var i = 0 ; i < arr.length; i ++){ if(arr[i] > 100){ return true; } } return false; } fnIsGreaterThan100_loop([30,60,90,120]); fnIsGreaterThan100_loop([30,60,90]);
输出:
true false
- 程序 2:使用 Array.some()
function fnIsGreaterThan100_some(arr){ return arr.some(function(element){ return(element> 100); }); } fnIsGreaterThan100_some([30,60,90,120]); fnIsGreaterThan100_some([30,60,90]);
输出:
true false
示例:给定一个数组,编写一个函数来检查数组是否包含偶数。
- 方案 1:天真的方法
function fnIsEven_loop(arr){ for(var i = 0 ; i < arr.length; i ++){ if(arr[i] % 2 === 0){ return true; } } return false; } fnIsEven_loop([1,3,5]); fnIsEven_loop([1,3,5,6]);
输出:
false true
- 程序 2:使用 Array.some()
function fnIsEven_some(arr){ return arr.some(function(element){ return(element %2 === 0); }); } fnIsEven_some([1,3,5]); fnIsEven_some([1,3,5,6]);
输出:
false true
程序员在使用 Array.every() 和 Array.some() 等数组函数时常犯的错误之一是他们忘记了回调函数中的返回值。请注意,如果您没有从回调函数返回任何值,则会返回 null,这将被解释为 false。
此外,重要的是要知道这些数组函数是在 ECMAScript 5 中引入的。因此,IE9 或更高版本支持这些函数。如果您还需要将它用于旧版浏览器,那么像 underscore.js 这样的库可以为您提供帮助,它具有此类功能的等效实现。
必须使用 JavaScript 数组函数 - 第 2 部分
必须使用 JavaScript 数组函数 - 第 3 部分
此外,如果您想深入了解上述功能,可以参考以下官方链接
1. http://www.ecma-international.org/ecma-262/5.1/#sec-15.4.4.16
2. http://www.ecma-international.org/ecma-262/5.1/#sec-15.4.4.17
关于作者:
“Harshit 是一名技术爱好者,对编程有着浓厚的兴趣。他持有一个 B.技术。 JIIT, Noida 的计算机科学学位,目前在 SAP 担任前端开发人员。他还是国家级乒乓球运动员。除此之外,他还喜欢看电影和英语情景喜剧来放松身心。他常驻德里,您可以通过 https://in.linkedin.com/pub/harshit-jain/2a/129/bb5 与他联系
如果您还想在这里展示您的博客,请参阅 GeeksforGeeks 上的客座博客文章。