2010-12-14 4 views
1

だから、これは実行しようとする奇妙なことかもしれませんが、それが可能だ場合、私は興味:キーが存在しない場合、連想JavaScript配列で最も近いキーインデックスを取得するにはどうすればよいですか?

は、私はこのような連想配列を持っていると言う:

myarray[50] = 'test1' 
myarray[100] = 'test2' 

私はだそれによって'test1'にアクセスすることができますキー、もちろん:

myarray[50]; // returns 'test1' 

しかし、私は、私は、配列に見ることができることを、「60」のインデックスキーを持ち、60キーがない場合は、取得する場合の方法があります次の「最も近い」キーの値、「50」?

このケースでは、ビデオのキューポイントを設定しようとしています。ユーザーがキューポイントを探して見逃している場合は、最後のキューポイントからの情報を表示しますそれを超えて追求した。

私は 'in'演算子でキーの存在を確認できます。しかし、それが見つからない場合、存在する「前の」または「次に小さい」配列キーを取得するにはどうすればよいですか?

"index> myKey"の終了条件が見つかるまで "最後の"インデックス値を保存して、配列を反復処理する方法があると仮定します。多くのキューポイントを持つ長いビデオで、ユーザーが頻繁にシークする場合は、そのたびにキューポイントの配列全体が反復されます。これを行うためのより良い、より速い方法がありますか?

答えて

2

あなたがあなた自身の関数を書く必要があるだろう:

function getClosestTo(val, array) { 
    if (array[val] !== undefined) { 
     return val; 
    } else { 
     var upper = val; 
     var upperMatched = false; 
     var lower = val; 
     var lowerMatched = false; 

     while(upper < this.length) { 
      if (array[++upper] !== undefined) { 
       upperMatched = true; 
       break; 
      }; 
     }; 

     while(lower > -1) { 
      if (array[--lower] !== undefined) { 
       lowerMatched = true; 
       break; 
      }; 
     }; 

     if (upperMatched && lowerMatched) { 
      return upper - val < val - lower ? upper : lower; 
     } else if (upperMatched) { 
      return upper; 
     } else if (lowerMatched) { 
      return lower; 
     }; 
    }; 

    return -1; 
}; 

あなたはまた作るためには、Arrayプロトタイプの方法としてこれを追加することができますが(私が何を考えて)より読みやすいです:

Array.prototype.getClosestTo = function (val) { 
    if (this[val] !== undefined) { 
     return val; 
    } else { 
     var upper = val; 
     var upperMatched = false; 
     var lower = val; 
     var lowerMatched = false; 

     while(upper < this.length) { 
      if (this[++upper] !== undefined) { 
       upperMatched = true; 
       break; 
      }; 
     }; 

     while(lower > -1) { 
      if (this[--upper] !== undefined) { 
       lowerMatched = true; 
       break; 
      }; 
     }; 

     if (upperMatched && lowerMatched) { 
      return upper - val < val - lower ? upper : lower; 
     } else if (upperMatched) { 
      return upper; 
     } else if (lowerMatched) { 
      return lower; 
     }; 
    }; 

    return -1; 
}; 

// Usage: 
// var closestKey = theArray.getClosestTo(50); 
+0

ちょうど私が疑うものは、ヒントのおかげで!私はArrayプロトタイプにそれを置くことは考えていませんでしたが、それはそんなに滑らかです! – thaddeusmt

関連する問題