javascript技巧

关注公众号 jb51net

关闭
首页 > 网络编程 > JavaScript > javascript技巧 > JS数组方法reduce、every、some

一次性让大家搞懂JavaScript数组方法reduce、every、some

作者:漠月瑾

在JavaScript的数组工具库中,every()和some()是处理逻辑判断的黄金组合,下面这篇文章主要介绍了JavaScript数组方法reduce、every、some的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下

前言

在 JavaScript 开发中,reduceevery 和 some 是三个高频使用的数组高阶方法,但它们的用途和区别常常令人混淆。本文将用 ‌原理剖析 + 场景对比 + 手写实现‌ 帮你彻底理解它们,从此告别死记硬背!

一、reduce:数组的「熔炉」

1.1 核心特性

1.2 使用场景

1.3 示例代码

// 求数组元素乘积
const nums = [2, 3, 4];
const product = nums.reduce((acc, num) => acc * num, 1); // 24

// 数组转对象映射
const users = ['Alice', 'Bob'];
const map = users.reduce((acc, user) => {
  acc[user] = true;
  return acc;
}, {}); // { Alice: true, Bob: true }

1.4 原理实现

function myReduce(arr, callback, initialValue) {
  let acc = initialValue ?? arr[0];
  let start = initialValue === undefined ? 1 : 0;
  
  for (let i = start; i < arr.length; i++) {
    acc = callback(acc, arr[i], i, arr);
  }
  return acc;
}

二、every:数组的「质检员」

2.1 核心特性

2.2 使用场景

2.3 示例代码

// 是否全为偶数
const nums = [2, 4, 6, 7];
const allEven = nums.every(num => num % 2 === 0); // false

// 是否全为有效用户
const users = [{age: 18}, {age: 20}];
const allValid = users.every(user => user.age >= 18); // true

2.4 原理实现

function myEvery(arr, callback) {
  for (let i = 0; i < arr.length; i++) {
    if (!callback(arr[i], i, arr)) return false;
  }
  return true;
}

三、some:数组的「探测器」

3.1 核心特性

3.2 使用场景

3.3 示例代码

// 是否存在负数
const nums = [3, -1, 5];
const hasNegative = nums.some(num => num < 0); // true

// 是否有管理员用户
const users = [{role: 'user'}, {role: 'admin'}];
const hasAdmin = users.some(user => user.role === 'admin'); // true

3.4 原理实现

function mySome(arr, callback) {
  for (let i = 0; i < arr.length; i++) {
    if (callback(arr[i], i, arr)) return true;
  }
  return false;
}

四、横向对比表

方法返回值短路特性核心思想类比逻辑运算符
reduce任意类型累积熔炼
every布尔值全真‌才为真&&
some布尔值一真‌即为真

五、记忆心法

‌reduce 联想‌:

every & some 对比‌:

六、实战训练

1. ‌用 reduce 实现数组去重

const arr = [1, 2, 2, 3];
const unique = arr.reduce((acc, num) => 
  acc.includes(num) ? acc : [...acc, num], []
);

2. ‌用 every 检测全大写字符串

const words = ['HELLO', 'WORLD'];
const isAllUpper = words.every(word => 
  word === word.toUpperCase()
); // true

3. 用 some 检查素数存在性

const nums = [4, 6, 8, 11];
const hasPrime = nums.some(num => {
  for (let i = 2; i <= Math.sqrt(num); i++) {
    if (num % i === 0) return false;
  }
  return num > 1;
}); // true(11是素数)

总结

理解这三个方法的关键在于抓住它们的 ‌数据流向‌ 和 ‌设计目的‌

下次忘记用法时,只需问自己:

到此这篇关于JavaScript数组方法reduce、every、some的文章就介绍到这了,更多相关JS数组方法reduce、every、some内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文