「这是我参与11月更文挑战的第1天,活动详情查看:2021最后一次更文挑战」
问题展示
代码:
function fun1(nums) {
let res = [...new Set(nums)];
for (let i = 0; i < res.length; i++) {
res[i] = Number(res[i]);
console.log();
}
res.sort(); //(10) [1, 10, 11, 2, 3, 4, 5, 6, 7, 8]
if (res[2] > res[res.length - 1]) {
console.log(true); //true
} else {
console.log(false);
}
console.log(res); //(10) [1, 10, 11, 2, 3, 4, 5, 6, 7, 8]
}
fun1([3, 2, 3, 1, 2, 4, 5, 5, 6, 7, 7, 8, 2, 3, 1, 1, 1, 10, 11, 5, 6, 2, 4, 7, 8, 5, 6])
分析&解决
用sort排序的本意是达到数组变成[1, 2, 3, 4, 5, 6, 7, 8, 10, 11]的结果,后来结果却是[1, 10, 11, 2, 3, 4, 5, 6, 7, 8],开始以为是把数字看成字符进行排序,后来用Number强制转换后发现不行!看了一下别人的sort排序和菜鸟教程,明白了这个原因。
在Javascript数组排序中有一个sort()方法,sort()方法可以说分为两种,一种是文字数组排序,一种是数字数组排序。
在菜鸟教程对sort的描述有这么一句话: sort() 方法用于对数组的元素进行排序。 排序顺序可以是字母或数字,并按升序或降序。默认排序顺序为按字母升序。
注意:当数字是按字母顺序排列时"40"将排在"5"前面。使用数字排序,你必须通过一个函数作为参数来调用。 注意: 这种方法会改变原始数组!。
解决方案
var thirdMax = function (nums) {
let res = [...new Set(nums)];
res.sort((a, b) => a - b); //核心语句
console.log(res);
if (res.length < 3) {
console.log(res[res.length - 1]);
return res[res.length - 1]
} else {
console.log(res[res.length - 3]);
return res[res.length - 3]
}
};
thirdMax([3, 2, 3, 1, 2, 4, 5, 5, 6, 7, 7, 8, 2, 3, 1, 1, 1, 10, 11, 5, 6, 2, 4, 7, 8, 5, 6])
sort()排序参数的使用
如果想按照其他标准进行排序,就需要提供比较函数,该函数要比较两个值,然后返回一个用于说明这两个值的相对顺序的数字。比较函数应该具有两个参数 a 和 b,其返回值如下: 若 a 小于 b,在排序后的数组中 a 应该出现在 b 之前,则返回一个小于 0 的值。 若 a 等于 b,则返回 0。 若 a 大于 b,则返回一个大于 0 的值。 所以得出如果想要升序排列的话通过a-b就可以实现 sort((a,b)=>a-b) ,反序也可以通过这个来做到。