num_list = [34,6,546,5,100,546,103,546,16,77];
// 复制一个新数组 x
// x的元素作为键 元素的个数作为值 放到对象中
// 对新数组进行升序排序 拿到最大值
// 到对象中找到最大值出现的次数
// 新数组的长度-最大值出现的次数-1 = 新数组第二大值的下标
// 根据下新数组第二大值的下标拿到第二大值
// 到原数组中 查看第二大值的下标 就是我们想要的结果
// 先排序
num_list = [34,6,546,5,100,546,103,546,16,77];
function get_second_num_index(arr) {
// arr 是原数组
// 复制一个数组然后排序
var newarr = arr.slice(0);
newarr.sort(function (a, b) {
return a - b
});
// 拿到每个元素出现的次数 需要知道最大值出现的次数
// 第二大值的小标 等于 length-最大值出现的次数
var res = {};
// 遍历newarr
for (var k in newarr) {
if (res[newarr[k]]) {
// newarr[k] 是数组的元素
// res[newarr[k]] 对象中这个键是否存在 存在个数+1
res[newarr[k]]++;
} else {
// 不存在个数为1
res[newarr[k]] = 1;
}
}
// {5:1,6:1,16:1,34:1,77:1,100:1,103:1,546:3}
// 元素:次数
var max_num = res[newarr[newarr.length - 1]]; //拿到最大值出现的次数 3
// 根据最大值出现的次数 拿到第二大值的下标
// 第二大值的下标 = length-最大值出现的次数-1
// 在newarr 中 根据第二大值的下标拿到第二大值的元素
// 103
// 在原数组中找到103的下标
return arr.indexOf(newarr[newarr.length - max_num-1]); //
// newarr中 100的下标
}
num_list = [34,6,546,5,101,103,546,546,16,77];
console.log(get_second_num_index(num_list));
// 方法二
// 去重
// 1.遍历原数组
// 2.准备一个空数组
// 3.原数组的元素 如果不在空数组中 那么加进去 如果有了就不加
// 4. 新数组就是去重以后的
// 5. 新数组的长度-2 就是第二大值的下标
// 6.根据下新数组第二大值的下标拿到第二大值
// 7.到原数组中 查看第二大值的下标 就是我们想要的结果