蓝桥杯 web 谁最长(reduce方法/filter方法)

答案
①解法1(reduce方法找最长)

const getMaxArrays = (...arrays) => {
  // 检查所有传入的参数是否都是数组
  if (!arrays.every(item => Array.isArray(item))) {
    return [];
  }

  // 检查所有数组的长度是否都相同
  if (arrays.every(arr => arr.length === arrays[0].length)) {
    return [];
  }

  // 如果没有传入任何数组,则返回空数组
  if (arrays.length === 0) {
    return [];
  }

  // 使用 reduce 方法找到最长的数组
  return arrays.reduce((acc, cur) => {
    // 如果累积器为空或者当前数组的长度大于累积器中的数组长度
    if (acc.length === 0 || cur.length > acc[0].length) {
      acc = [cur];
    } 
    // 如果当前数组的长度等于累积器中的数组长度
    else if (cur.length === acc[0].length) {
      acc.push(cur);
    }
    return acc;
  }, []);
};

详细解释

  1. 函数定义:

    const getMaxArrays = (...arrays) => {
    • getMaxArrays 是一个箭头函数,使用剩余参数(spread rest)语法 (...arrays) 来接收任意数量的数组参数。
  2. 检查输入是否为数组:

    if (!arrays.every(item => Array.isArray(item))) {
      return [];
    }
    • 使用 every 方法检查所有传入的参数是否都是数组。
    • 如果有任何一个参数不是数组,则返回一个空数组 []
  3. 检查数组长度是否一致:

    if (arrays.every(arr => arr.length === arrays[0].length)) {
      return [];
    }
    • 使用 every 方法检查所有数组的长度是否都相同。
    • 如果所有数组的长度都相同,则返回一个空数组 []
  4. 检查数组是否为空:

    if (arrays.length === 0) {
      return [];
    }
    • 如果没有传入任何数组,则返回一个空数组 []
  5. 使用 reduce 方法找到最长的数组:

    return arrays.reduce((acc, cur) => {
      if (acc.length === 0 || cur.length > acc[0].length) {
        acc = [cur];
      } 
      else if (cur.length === acc[0].length) {
        acc.push(cur);
      }
      return acc;
    }, []);
    • reduce 方法用于遍历数组并累积结果。
    • acc 是累积器,初始值为空数组 []
    • cur 是当前元素。
    • 如果累积器为空或者当前数组的长度大于累积器中的数组长度,则将累积器设置为当前数组 [cur]
    • 如果当前数组的长度等于累积器中的数组长度,则将当前数组添加到累积器中。
  6. 返回结果:

    函数最终返回的是一个包含最长数组的数组。如果有多数组长度相同且最长,则返回这些数组组成的数组。

    方法二( filter方法找最长)

    const getMaxArrays = (...arrays) => {
      // 检查是否有任何传入的参数不是数组
      if (arrays.some(item => !Array.isArray(item))) {
        return [];
      }
    
      // 计算所有数组的最大长度
      const max = Math.max(...arrays.map(arr => arr.length));
    
      // 检查所有数组的长度是否都等于最大长度
      if (arrays.every(arr => arr.length === max)) {
        return [];
      }
    
      // 如果没有传入任何数组,则返回空数组
      if (arrays.length === 0) {
        return [];
      }
    
      // 返回长度等于最大长度的数组
      return arrays.filter(arr => arr.length === max);
    };
    
    module.exports = getMaxArrays; // 请勿删除

    详细解释

  7. 函数定义:

    const getMaxArrays = (...arrays) => {
    • getMaxArrays 是一个箭头函数,使用剩余参数(spread rest)语法 (...arrays) 来接收任意数量的数组参数。
  8. 检查输入是否为数组:

    if (arrays.some(item => !Array.isArray(item))) {
      return [];
    }
    • 使用 some 方法检查是否有任何一个传入的参数不是数组。
    • 如果有任何一个参数不是数组,则返回一个空数组 []
  9. 计算所有数组的最大长度:

    const max = Math.max(...arrays.map(arr => arr.length));
    • 使用 map 方法获取每个数组的长度。
    • 使用 Math.max 和扩展运算符 ... 获取这些长度中的最大值。
  10. 检查所有数组的长度是否都等于最大长度:

    if (arrays.every(arr => arr.length === max)) {
      return [];
    }
    • 使用 every 方法检查所有数组的长度是否都等于最大长度。
    • 如果所有数组的长度都等于最大长度,则返回一个空数组 []
  11. 检查数组是否为空:

    if (arrays.length === 0) {
      return [];
    }
    • 如果没有传入任何数组,则返回一个空数组 []
  12. 返回长度等于最大长度的数组:

    return arrays.filter(arr => arr.length === max);
    • 使用 filter 方法筛选出长度等于最大长度的数组。
  13. 导出模块:

    module.exports = getMaxArrays; // 请勿删除
    • 导出 getMaxArrays 函数以便在其他模块中使用。

思路分析

  1. 参数校验

    • 检查所有参数是否为数组。若存在非数组参数,直接返回 []
    • 若无参数传入,直接返回 []
  2. 处理参数全为数组的情况

    • 判断所有数组长度是否相同
      • 若参数数量 ≥ 2 且所有长度相同 → 返回 []
    • 否则,找出最长数组
      • 计算最大长度。
      • 过滤出所有长度等于最大值的数组,组成结果。

关键点说明
  1. 参数校验

    • arrays.every(Array.isArray) 确保所有参数是数组。
    • arrays.length === 0 处理无参数的情况。
  2. 长度相同判断

    • arrays.every(arr => arr.length === firstLength) 验证所有数组长度是否与第一个数组相同。
    • arrays.length >= 2 确保仅当参数数量 ≥ 2 时才返回空数组(单个数组时仍返回它)。
  3. 筛选最长数组

    • Math.max(...arrays.map(arr => arr.length)) 快速获取最大长度。
    • arrays.filter(...) 筛选出长度等于最大值的数组。

相关知识点讲解

1.map()

  • .map() 是数组的一个实例方法,用于遍历数组的每个元素,并对每个元素执行一个指定的函数(回调函数),最终返回一个新数组
  • .map() 是数组转换的利器,适用于数据格式化、提取属性、生成新结构等场景。
  • 牢记三大原则:不修改原数组、必须返回新元素、按顺序处理。
  • . map与 forEach 和 filter 的区别

    方法功能返回值
    map()转换每个元素,生成新数组。新数组
    forEach()遍历数组,无返回值(常用于执行副作用操作)。undefined
    filter()筛选符合条件的元素,生成新数组。新数组(可能为空)

2..filter()

  • filter() 方法会对数组中的每个元素执行一次回调函数,并返回一个新数组,其中只包含满足回调函数条件的元素。原数组不会被修改
  • .filter() 是数组筛选的利器,适用于数据过滤、条件筛选、去重等场景。
  • 核心原则:不修改原数组、返回新数组、按条件筛选元素。

3.== 和=== 的区别

  • = = = 是严格相等运算符,它要求值和类型都相等。
  • = = 是宽松相等运算符,它只比较,但在比较之前会尝试进行隐式类型转换。如果两个操作数的类型不同,JavaScript 会尝试将它们转换为相同的类型后再进行比较。

4.Math.max

Math.max 是 JavaScript 中的一个内置函数,用于找出并返回一组数值中的最大值。你可以把它想象成在一堆数字中找出最大的那个数。

示例:

console.log(Math.max(1, 3, 2)); // 输出 3

在这个例子中,Math.max 找出了三个数(1, 3, 2)中的最大值,也就是 3。

但是,如果你有一个数组而不是单独的数值,你不能直接使用 Math.max 来处理这个数组,因为 Math.max 不接受数组作为参数。这时就需要用到扩展运算符了。

5.扩展运算符 ...

扩展运算符 ... 是一种特殊语法,允许你在调用函数时“展开”数组或对象。对于数组来说,它会将数组元素一个接一个地传递给函数,就像手动输入这些元素一样。

示例:

const numbers = [1, 3, 2];
console.log(Math.max(...numbers)); // 输出 3

这里,...numbers 将数组 [1, 3, 2] 展开为单独的元素 1, 3, 2,然后 Math.max 可以像之前那样正常工作,找到这三个数中的最大值。

6.some 方法

some 方法是 JavaScript 数组原型上的一个方法,用来测试数组中的至少一个元素是否通过了提供的函数的测试。换句话说,如果你想知道数组中是否有任何一个元素满足特定条件,就可以使用 some 方法。

示例:

const numbers = [1, 2, 3, 4];
const hasNumberGreaterThanThree = numbers.some(number => number > 3);
console.log(hasNumberGreaterThanThree); // 输出 true

在这个例子中,我们检查数组 numbers 是否包含任何大于 3 的数字。由于 4 满足这个条件,所以 some 方法返回 true

如果数组中没有任何一个数字大于 3,那么 some 方法就会返回 false

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值