用js,找出数组中第二小的数的元素的索引

例如
var arr = [0, 0, 0, 2, 0, 0, 3, 0, 0, 0, 7, 0, 9]
var arr = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2]
var arr = [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0]
应该输出:
3
12
4

阅读 2k
2 个回答
function find(arr) {
    var tmp = {}
    arr.forEach(num => tmp[num] = true)
    return arr.indexOf(Number(Object.keys(tmp)[1]))
}

@12345678 利用了 JS 对象 key 是数字时有序这个特性,👍

我来写个利用 Set 去重再排序的写法(Set 不会按数字序排)

function find(arr) {
    return arr.indexOf([...new Set(arr)].sort((a, b) => a - b)[1]);
}

再来个中规中矩的写法

function find(arr) {
    // 保存最小的两个 index,初始化就是 0
    let mins = [0, 0];
    for (let i = 1; i < arr.length; i++) {
        // 如果当前数值跟 mins 中的任意一个相同,那直接忽略掉
        if (arr[i] === arr[mins[0]] || arr[i] === arr[mins[1]]) {
            continue;
        }

        // 如果当前数值小于最小的那个,即 arr[mins[0]],
        // 那 mins[0] 替换为当前 index,原来的值顺移到 mins[1]
        if (arr[i] < arr[mins[0]]) {
            ([mins[1], mins[0]] = [mins[0], i]);
        }
        // 否则,如果 mins 中的两个值相同,直接替换掉 mins[1],此时 mins[1] 指向的不是当前最小就是当前第二小
        // 如果不同,但当前值小于 mins[1] 对应的值,也替换掉 mins[1],此时 min[1] 指向的是当前第二小
        else if (arr[mins[0]] == arr[mins[1]] || arr[i] < arr[mins[1]]) {
            mins[1] = i;
        }
    }
    return mins[1];
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题