2011-12-13 7 views
0

各スライドの名前を持つconfigオブジェクトを、スクロール可能なjQueryツールをインスタンス化する関数に渡しています。アクティブなタブIDと一致するように、ロケーションバーのURLを設定します。私はそれが正しいスライド(それは提供されたコードの下にあります)に移動する名前でURLを渡すように働いているが、スライドが変更されたときにURLを更新しようとしています。私はそれを得るために何をする必要があるのか​​知っていますが、それはどのように行うのではなく、質問のタイトルのようなものです。オブジェクトに値を渡し、その値を持つプロパティを取得します。オブジェクトのプロパティ値が指定されたJavaScriptでは、対応するプロパティ名を見つけることはできますか?

$(function() { 
    Scrollablenav.init({ 
     "#tulips": 0, 
     "#daffodils": 1, 
     "#zebras": 2, 
     "#horseshoes": 3 
    }); 
}); 

Scrollablenav.init = function(config){ 
    var scroller = $(".scrollable").scrollable({ 
     circular: true, 
     onSeek: function (event) { 
      parent.location.hash = function(){ 
      //something that looks at config, sends it the value of the current slide and returns corresponding property name 
      } 
     } 
    }).navigator({ 
      navi: '#slideTabs', 
      naviItem: 'a', 
      activeClass: 'current', 
      history: true 
    }).data('scrollable'); 

    if (!isNaN(config[location.hash])){ 
     scroller.seekTo(config[location.hash], 0); 
    } 
} 
+0

あなたはconfigオブジェクトを使用している唯一の場所ですか?キー/値を逆にしたり、両方を@MikeChristensenのようなオブジェクトに移動させるのはなぜですか? – Mathletics

+0

複数のプロパティの値が同じ場合はどうなりますか?最初に一致するプロパティ、またはすべての配列を検索したいのですか?...?私はそれがあなたのサンプルデータでは起こらないだろうと思っていますが、それでも... – nnnnnn

+0

それはインデックスなので、一致するべきではありません。ストレート配列を使ってインデックス値を使うことを考えましたが、まだ両方の方法が必要です(すなわち、 'scroller.seekTo(config [location.hash]、0);') – Damon

答えて

0

設定の形式を変更できますか?言い換えれば、我々は行うことができます。

var keys = { 
    1: 'tulips', 
    2: 'daffodils', 
    3: 'zebras', 
    4: 'horseshoes', 
}; 

UPDATE:

問題が解決しない場合は

$(function() { 
    Scrollablenav.init({ 
     "#tulips": { Key: 'tulips', Index: 0 }, 
     "#daffodils": { Key: 'daffodils', Index: 1 }, 
     "#zebras": { Key: 'zebras', Index: 2 }, 
     "#horseshoes": { Key: 'horseshoes', Index: 3 } 
    }); 
}); 

は、あなたがキーに戻ってインデックスをマッピングし、どこか新しいオブジェクトを作ることができます

また、動的にこの設定を構築することができます:

$(function() { 
    var values = ['#tulips', '#daffodils', '#zebras', '#horseshoes']; 
    var config = {}; 

    for(var i = 0; i < values.length; i++) 
    { 
     config[values[i]] = { Index: i, Key: values[i] }; 
    } 

    Scrollablenav.init(config); 
}); 
+0

これはうまくいくと思いますが、実際には同じ情報を2つの場所に配置する必要はありません。 – Damon

+0

私は全く同意します。すべてのキーを複製することが本当に嫌な場合は、代わりにコードを使用してその設定マップを構築することができます。 –

+0

@Damon - 私の答えを更新しました.. –

2

これはなんですか?

function getMyHash(config, value) { 
    for (item in config) { 
    if (config[item] === value) { 
     return item; 
    } 
    } 
}; 

基本的に値を繰り返して一致させる必要があります。値で検索することはできません。

4

あなたは、その値に基づいて、プロパティ名を見つけるために、独自の機能を作成することができます。

function findPropertyName(object, property_value, strict) { 
    if (typeof strict=='undefined'){ 
     strict = false; 
    }; 
    for (property in object){ 
     if ((strict && object[property] === property_value) || 
      (!strict && object[property] == property_value)){ 
      return property; 
     } 
    } 
    return false; 
} 

機能の説明:

  • をそれは、このような場合、値、またはfalseを与えられた最初のプロパティの名前を返します。プロパティが見つかりました。
  • 第三paramは厳密な比較がなされるべきであるかどうかを判断する責任がある(例えば、文字列「123は」123を整数に等しい - 。'123'==123のようではなく厳密等しい - '123'===123のように)。
  • 与えられた値を持つすべてのプロパティを返すように関数を改良することができますが、必要ないと思います。

実際に機能を確認するには、this jsfiddleを参照してください。

関連する問題