目录
一、array.every()的使用与技巧
1.1、基本语法
arr.every(callback(currentValue, index, array), thisArg)
callback:一个函数,它最多接受三个参数(当前元素的值、当前元素的索引、原数组)。
- currentValue:当前被遍历的元素。
- index:当前元素的索引。
- array:调用 every 方法的数组。
thisArg(可选):执行回调函数时的 this 上下文。
1.2、返回值
一个布尔值,表示所有元素是否都满足条件。
1.3、使用技巧
array.every()用于检验数组中所有元素是否都满足某一要求。
应用场景:数据验证、权限检查、一致性检查。
1.3.1、数据验证
开发一个用户注册系统,需要验证用户提供的所有信息是否有效。用户对象可能包含姓名、邮箱、密码和密码确认等字段,需要验证用户注册信息是否合法,比如检查用户名的长度、密码的强度和匹配性,还可以通过正则表达式来验证邮箱格式的正确性。
//假设我们正在开发一个用户注册系统,需要验证用户提供的所有信息是否有效。用户对象可能包含姓名、邮箱、密码和密码确认等字段。
const users = [
{
name: "John Doe",
email: "john.doe@example.com",
password: "securepassword123",
confirmPassword: "securepassword123"
},
{
name: "Jane Smith",
email: "jane.smith@example.com",
password: "password",
confirmPassword: "password"
},
{
name: "Emily Jones",
email: "emily.jones@example.com",
password: "SafePass123!",
confirmPassword: "SafePass123!"
},
{
name: "William Brown",
email: "william.brown@example.com",
password: "pass123",
confirmPassword: "pass1234" // 注意这里的不匹配
},
{
name: "Sophia Lee",
email: "sophia.lee@example.com",
password: "mysecurepassword",
confirmPassword: "mysecurepassword"
},
// ... 可以根据需要继续添加更多用户对象
];
const allValid = users.every(user => {
const { name, email, password, confirmPassword } = user;
const emailRegex = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/;
return (
name.length >= 3 && // 假设用户名至少需要3个字符
password.length >= 8 && // 密码至少8个字符
password === confirmPassword && // 密码和确认密码匹配
emailRegex.test(email) // 邮箱格式正确
);
});
console.log(allValid); // 如果所有用户信息都有效,输出 true;否则输出 false。
1.3.2、权限检查
在权限系统中,有时需要检查一组用户是否都具有特定的系统管理员权限。检查数组中的每个用户是否具有“admin”角色。这可以用于确保只有具有管理员权限的用户才能访问特定的系统功能。
//在权限系统中,我们可能需要检查一组用户是否都具有特定的系统管理员权限。
const users = [
{ username: "john", roles: ["admin", "user"] },
{ username: "jane", roles: ["admin", "editor"] },
{ username: "dave", roles: ["user"] }, // 只有用户角色,没有管理员权限
{ username: "sarah", roles: ["admin", "user", "editor"] },
{ username: "michael", roles: ["editor"] }, // 只有编辑角色
{ username: "olivia", roles: ["admin"] },
{ username: "liam", roles: ["user", "editor"] }, // 缺少管理员角色
// ... 其他用户对象
];
const allAdmins = users.every(user => {
return user.roles.includes("admin");
});
console.log(allAdmins); // 如果所有用户都是管理员,输出 true;否则输出 false。
1.3.3、一致性检查
在处理数据导入功能时,有时需要验证导入的数据是否符合预定义的结构。每个数据项可能是一个对象,包含多个属性,如日期、金额和描述。
//假设我们正在处理一个数据导入功能,需要验证导入的数据是否符合预定义的结构。每个数据项可能是一个对象,包含多个属性,如日期、金额和描述。
const dataEntries = [
{ date: "2024-01-01", amount: 100.00, description: "Payment for services" },
{ date: "2024-01-02", amount: 200.00, description: "Purchase of goods" },
{ date: "2024-01-03", amount: -50.00, description: "Refund for order" }, // 负数金额
{ date: "01/01/2024", amount: 300.00, description: "Invalid date format" }, // 日期格式错误
{ date: "2024-01-05", amount: "350.00", description: "Amount as string" }, // 金额为字符串类型
{ date: "2024-01-06", amount: 400.00, description: "" }, // 描述为空字符串
{ date: "2024-01-07", amount: 500.00, description: null }, // 描述为null
{ date: "2024-01-08", amount: 600.00, description: undefined }, // 描述为undefined
// ... 其他数据项
];
const allConsistent = dataEntries.every(entry => {
const { date, amount, description } = entry;
const dateRegex = /^\d{4}-\d{2}-\d{2}$/; // 日期格式 YYYY-MM-DD
return (
typeof date === "string" && dateRegex.test(date) && // 日期格式正确
typeof amount === "number" && !isNaN(amount) && amount > 0 && // 金额是正数
typeof description === "string" && description.trim().length > 0 // 描述不为空
);
});
console.log(allConsistent); // 如果所有数据项都符合格式,输出 true;否则输出 false。
二、array.every()与array.some()
2.1、相同之处
它们都接受一个回调函数,该函数会被依次应用于数组的每个元素,返回值都是布尔值。
2.2、不同之处
目的:array.every()用于检查数组中的所有元素是否都满足某个条件,如果有一个不满足都会返回false;array.some()用于检查数组中是否至少有一个元素满足某个条件,只要有一个满足,就会返回true。
短路时机:array.every()只要有一个元素不符合回调函数条件,就会触发短路机制;array.some()只要有一个元素符合回调函数条件,就会触发短路机制。合理的运用短路机制,能大大提升数组检查的效率。
我之前写过array.some()的介绍博客,我个人用array.some()更多,传送门:通过array.some()实现权限检查、表单验证、库存管理、内容审查和数据处理;js数组元素检查的方法,some()的使用详解,array.some与array.every的区别(附实际应用代码)-CSDN博客
三、总结
array.every()可以用来数据验证、权限检查、一致性检查等数据校验工作,核心在于利用其短路机制,速度更快,节约性能。
W3school传送门(我的博客更详细):JavaScript Array every() 方法
博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~