0

かなり基本的な質問ですが、Javascript で解決する方法の例が見つからないようです。

「n」を表す数値を渡すと、配列内で n 番目に小さい数値の位置を返す関数を作成したいと思います。

たとえば、私がした場合:

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

3 番目に小さい数字は 1 であるため、場所は 4 になりますが、その数字の最初のいくつかの重複をスキップしたいと思います。

n 番目に小さい数値の位置を見つける一般的な解決策は、次のようにすることです。

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

ただし、問題は、3 番目に小さい数値が 1 であることを知っているが、inArray 関数は重複を気にしないため、常に場所が 2 になることです。

おそらくソート機能を使用せずに、これを行う方法はありますか? 多くの処理を必要とするようで、これは非常に頻繁に実行される機能です。

4

2 に答える 2

1
// 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];

もちろん、lastIndexOfまたはindexOf、他の回答のいずれかで示唆されているように、コードが少なくなります。

于 2013-04-02T00:55:23.053 に答える
0

私があなたの質問を正しく理解していれば、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

の haxy shim は次のlastIndexOfように実行できます。

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

このシムは次のように呼び出す必要があります。location = lastIndexOf(array,nth_smallest);

于 2013-04-02T00:43:42.903 に答える