jquery 正在获取数组中第n个最小数字位置

p4tfgftt  于 2022-11-22  发布在  jQuery
关注(0)|答案(3)|浏览(131)

很 基本 的 问题 , 但 我 似乎 找 不到 任何 例子 , 如何 解决 它 在 Javascript 。
我 想 创建 一 个 函数 , 你 传递 一 个 代表 " n " 的 数字 , 它 返回 数组 中 第 n 个 最 小 数字 的 位置 。
例如 , 如果 我 这样 做 :

array = [5,6,1,1,1,8]
n = 3
location = nth_smallest(array, n)

中 的 每 一 个
位置 将 等于 4 , 因为 第 三 个 最 小 的 数字 是 1 , 但 我 想 跳过 该 数字 的 前 几 个 重复 。
找到 第 n 个 最 小 数 的 位置 的 常见 解决 方案 是 :

array = [5,6,1,1,1,8]
n = 3
nth_lowest = array.slice(0).sort()[n]
location = $.inArray(nth_lowest, array)

格式
然而 , 问题 是 , 它 总是 返回 位置 2 , 因为 它 知道 第 三 小 的 数字 是 1 , 但 inArray 函数 不 关心 重复 。
有 没有 什么 方法 可以 做到 这 一 点 , 可能 不 使用 排序 函数 ? 它 似乎 占用 了 大量 的 处理 , 这 是 一 个 将 经常 运行 的 函数 。

lfapxunr

lfapxunr1#

// remap array as pairs of value and index
// e.g. change [5, 6, 1] to [[5, 0], [6, 1], [1, 2]]
var augmented_array = array.map(function(val, index) { return [val, index]; });
// sort pairs by the first position, breaking ties by the second
augmented_array.sort(function(a, b) {
    var ret = a[0] - b[0];
    if (ret == 0) ret = a[1] - b[1];
    return ret;
});
// example array will now be [[1, 2], [5, 0], [6, 1]]
// so we get the location by just looking at the second position of a pair
var location = augmented_array[n - 1][1];

如果希望最后一个位置具有该值,请在排序后执行以下操作:

var position = n - 1;
while (position < augmented_array.length - 1 &&
       augmented_array[position][0] == augmented_array[position + 1][0]) {
  ++position;
}
var location = augmented_array[position][1];

或者,如果您想要第一个位置,请执行以下操作:

var position = n - 1;
while (position > 0 &&
       augmented_array[position][0] == augmented_array[position - 1][0]) {
  --position;
}
var location = augmented_array[position][1];

当然,lastIndexOfindexOf(如其他答案之一所示)将导致更少的代码。

mrwjdhj3

mrwjdhj32#

如果我没理解错你的问题,你是在寻找第n个最小数字的 * 最后一个 * 示例的位置吗?如果是,试试这个:

array = [5,6,1,1,1,8];
n = 3;
nth_smallest = array.slice(0).sort()[n];
location = array.lastIndexOf(nth_smallest); // assumes non-ancient browser and/or shim

lastIndexOf的haxy填隙可以如下完成:

function lastIndexOf(array,item) {
    return array.join("\x00").match(new RegExp(".*\x00"+item+"\x00"))[0].split("\x00").length-1;
}

此填充程序需要如下调用:location = lastIndexOf(array,nth_smallest);

nqwrtyyt

nqwrtyyt3#

const arr = [9,3,4,5,3,4,6,7,8,];

arr.sort((a,b)=>{return a-b});
console.log(arr[arr.length-1]);
arr.sort((a,b)=>{return a-b});
console.log(arr[0]);

要找到数组中的最小数字或最大数字,首先需要对任意数组排序,然后数组将是排序后的短序列,任何数组总是在索引中(arr[0])将是任何数组中的最小数字,而(arr[arr.lenght-1])总是最大数字,因为我们是按序列排序的,谢谢...

相关问题