2012-04-27 4 views
1

私はこれに似た質問が尋ねられていることを知っていますが、私はこれらを見て、a)彼らがどのように働くか、そしてb)自分の目的に合うようにそれらを適合させる方法について絶対に困惑しています。私は新しい質問を始めました。重複カウントを実行した後に配列内の重複値のインデックスを見つける方法はありますか?

私はわずか4つのインデックスの配列を持ち、各インデックスは数字を保持します。私の目的は、この配列の中で最低の値を見つけ出し、その最低値のインデックスを返すことです。これは問題ではありません...

2つ以上のインデックスで最小値が繰り返されると問題が発生します。

この場合、最小値が繰り返されているかどうかを調べるために配列の "count"を最初に実行し、次にカウントが1より大きい場合は、次のようにします。最後に、これらのインデックスの値をとり、それらの間で最も低い値を見つける前に曖昧な計算を行う必要があります。

例:この質問はすでに回答されている場合

array[ 12.44 , 10.33 , 17.45 , 10.33] 
    //First I need a count to find the number of times the lowest value (10.33) occurs 
    //Then I would like a function to return either a string containing 1,3 to 
    //represent the indices, or an array[ 1 , 3 

もう一度私は謝るが、私は彼以前の回答を理解するために繰り返し試みていると頭の方法を作ることができないとして、あなたは答えを説明することができるしてください。

jsを使用して配列内で繰り返し値を見つけるのはなぜ複雑ですか?

ご協力いただきありがとうございます。

ジョン

答えて

0
var arr = [12.44, 10.33, 17.45, 10.33], 
    lowest = Math.min.apply(Math, arr), //.. 10.33 
    index = $.map(arr, function(o,i) { if (o === lowest) return i; }), //.. [1,3] 
    numOfTimes = index.length; //.. 2 

説明:

Math.min機能です。任意の関数を呼び出して、その関数のコンテキストをfunction.call(context, param1, param2, paramEtc...)またはfunction.apply(context, param[])を使用して変更することができます。

Math.minは、パラメータのカンマ区切りリストが必要なので、Math.min(arr)を呼び出して配列を渡すことはできません。我々は面白い構文Math.min.apply(Math, arr)

$.map()は単なる便利なイテレータであることを持っている理由です、あなたは

+0

アンダースコア.jsとは何ですか?これは2つの指標を返しますか?またはただ一つ? – TranquilityEden

+0

@ TranquilityEden:jqueryを使用しているコードがきれいなので、コメントを削除しました。 Underscore.jsは非常にパワーの小さなjavascriptライブラリです。 jsで頻繁に作業する場合は、それに精通している必要があります。 – rkw

+0

ああ私は理解していると思う。私はあなたの助けを借りて私のコードにこれを差し込もうとします! – TranquilityEden

0

あなただけのすべての重複を除外するために、フィルタを作成し、その後、所望の数を取得するために一時的にアレイ上のいくつかの魔法を実行することができます。例えば

var arr  = [ 12.44 , 10.33 , 17.45 , 10.33], 
    filtered = [ ], 
    lowest; 

arr.forEach(function(value) { 
    if(filtered.indexOf(value) === -1) 
     filtered.push(value); 
}); 

lowest = Math.min.apply(null, filtered); // 10.33 
arr.indexOf(lowest); // 1 
+0

ありがとう!だから私はあなたが "value"に対してインデックス値をチェックして、 "filtered"という新しい配列を繰り返し値で埋めていくことになっているのでしょうか?私はインデックスの後で、重複の値ではありません。私が暗くなったらごめんなさい... – TranquilityEden

+0

@TranquilityEden:はい、基本的に私はそれをやっています。複製されていない新しい配列を作成し、元の配列のインデックスを取得します。実際には、フィルタリングされた配列からインデックスを取得する方が正しいでしょう。なぜなら、一部のインデックスが元の配列に存在しないか間違っている可能性があるからです。 – jAndy

1

どのように純粋なJSとこの方法についてのインデックスの配列を取得するために任意の方法を使用しているだろうか?

var myArr = [12.44 , 10.33 , 17.45 , 10.33]; //Your array  
var lowest = Math.min.apply(Math, myArr);  //Find the lowest number 
var count = 0;        //Set a count variable 
var indexes = [];    //New array to store indexes of lowest number 

for(var i=0; i<myArr.length;i++) //Loop over your array 
{ 
    if(myArr[i] == lowest) //If the value is equal to the lowest number 
    { 
     indexes.push(i); //Push the index to your index array 
     count++;   //Increment your counter 
    } 
} 
alert(count);   //2 
alert(indexes);   //1, 3 

とあなたのresponceのための作業jsFiddle here

+0

これはわかりました。彼らはjavascriptを介してこのタスクのjqueryを使用する利点はありますか?この関数は、1200ミリ秒ごとに100回まで多く呼び出されます。 – TranquilityEden

+0

@TranquilityEden jQueryコードは、rkwsの実装でわかるように、きれいでコンパクトです。私はパフォーマンス(十分な経験はありません)にコメントすることはできませんが、どの場合にどのように大きな違いがあるか分かりません。 (私は誰かがそれについて私を修正すると確信しています)。このコードを再利用可能な関数に入れると、それはあなたが望むものを達成するためのかなり良い方法です。 –

関連する問題