答案
①解法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;
}, []);
};
详细解释
-
函数定义:
const getMaxArrays = (...arrays) => {
getMaxArrays
是一个箭头函数,使用剩余参数(spread rest)语法(...arrays)
来接收任意数量的数组参数。
-
检查输入是否为数组:
if (!arrays.every(item => Array.isArray(item))) { return []; }
- 使用
every
方法检查所有传入的参数是否都是数组。 - 如果有任何一个参数不是数组,则返回一个空数组
[]
。
- 使用
-
检查数组长度是否一致:
if (arrays.every(arr => arr.length === arrays[0].length)) { return []; }
- 使用
every
方法检查所有数组的长度是否都相同。 - 如果所有数组的长度都相同,则返回一个空数组
[]
。
- 使用
-
检查数组是否为空:
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; }, []);
reduce
方法用于遍历数组并累积结果。acc
是累积器,初始值为空数组[]
。cur
是当前元素。- 如果累积器为空或者当前数组的长度大于累积器中的数组长度,则将累积器设置为当前数组
[cur]
。 - 如果当前数组的长度等于累积器中的数组长度,则将当前数组添加到累积器中。
-
返回结果:
函数最终返回的是一个包含最长数组的数组。如果有多数组长度相同且最长,则返回这些数组组成的数组。
方法二( 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; // 请勿删除
详细解释
-
函数定义:
const getMaxArrays = (...arrays) => {
getMaxArrays
是一个箭头函数,使用剩余参数(spread rest)语法(...arrays)
来接收任意数量的数组参数。
-
检查输入是否为数组:
if (arrays.some(item => !Array.isArray(item))) { return []; }
- 使用
some
方法检查是否有任何一个传入的参数不是数组。 - 如果有任何一个参数不是数组,则返回一个空数组
[]
。
- 使用
-
计算所有数组的最大长度:
const max = Math.max(...arrays.map(arr => arr.length));
- 使用
map
方法获取每个数组的长度。 - 使用
Math.max
和扩展运算符...
获取这些长度中的最大值。
- 使用
-
检查所有数组的长度是否都等于最大长度:
if (arrays.every(arr => arr.length === max)) { return []; }
- 使用
every
方法检查所有数组的长度是否都等于最大长度。 - 如果所有数组的长度都等于最大长度,则返回一个空数组
[]
。
- 使用
-
检查数组是否为空:
if (arrays.length === 0) { return []; }
- 如果没有传入任何数组,则返回一个空数组
[]
。
- 如果没有传入任何数组,则返回一个空数组
-
返回长度等于最大长度的数组:
return arrays.filter(arr => arr.length === max);
- 使用
filter
方法筛选出长度等于最大长度的数组。
- 使用
-
导出模块:
module.exports = getMaxArrays; // 请勿删除
- 导出
getMaxArrays
函数以便在其他模块中使用。
- 导出
思路分析
-
参数校验:
- 检查所有参数是否为数组。若存在非数组参数,直接返回
[]
。 - 若无参数传入,直接返回
[]
。
- 检查所有参数是否为数组。若存在非数组参数,直接返回
-
处理参数全为数组的情况:
- 判断所有数组长度是否相同:
- 若参数数量 ≥ 2 且所有长度相同 → 返回
[]
。
- 若参数数量 ≥ 2 且所有长度相同 → 返回
- 否则,找出最长数组:
- 计算最大长度。
- 过滤出所有长度等于最大值的数组,组成结果。
- 判断所有数组长度是否相同:
关键点说明
-
参数校验:
arrays.every(Array.isArray)
确保所有参数是数组。arrays.length === 0
处理无参数的情况。
-
长度相同判断:
arrays.every(arr => arr.length === firstLength)
验证所有数组长度是否与第一个数组相同。arrays.length >= 2
确保仅当参数数量 ≥ 2 时才返回空数组(单个数组时仍返回它)。
-
筛选最长数组:
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
。