2010-12-01 15 views
2

のは、私が持っているとしましょう:私はこれにその配列を回すために滑らかな、高速な方法を見つけようとしているJavascriptチャレンジどのように配列でこれを達成できますか?

 
var directions = [ "name", "start_address", "end_address", "order_date" ]; 

 

data: { 
    "directions[name]"   : directions_name.val(), 
    "directions[start_address]" : directions_start_address.val(), 
    "directions[end_address]" : directions_end_address.val(), 
    "directions[order_date]" : directions_order_date.val() 
} 

お知らせパターン。配列 "directions"の名前は、値の接頭辞です。 私は人々がこれを行う方法と少なくとも私が試してみる方法を提案する方法に興味があります。

ヒントをいただければ幸いです。

ありがとうございます!

EDIT **これまでに提案のため

感謝。しかし、私は、配列 "方向"は動的である必要があることに言及することを忘れていました。

たとえば、私が使用することができます

 
places = ["name", "location"] 

 
data: { 
    "places[name]"  : places_name.val(), 
    "places[location]" : places_location.val() 
} 
 
alpha = ["blue", "orange"] 

を返す必要がありますので、基本的に、私はちょうど関数に配列を渡すことができ

 
data: { 
    "alpha[blue]" : alpha_blue.val(), 
    "alpha[orange]" : alpha_orange.val() 
} 

を返す必要がありますそのデータオブジェクトを返します。

 
var directions = ["name", "start_address", .... ]; 
var data = someCoolFunction(directions); 

希望がある。

** EDIT * ** * * ** ** * ****

私は彼らの助けのために皆に感謝したいと思います。私は別のルートに行きました。それを考えた後、HTMLフォーム自体にいくつかのメタ情報を入れることにしました。そして、私は命名規則に固執します。そのため、HTMLフォームには、情報をPOSTする場所をjQueryに指示するために必要な情報があります(膨大な情報はありません)。このよう

 
    // addBox 
    // generic new object box. 
    function addBox(name, options) { 
     var self = this; 
     var title = "Add " + name.charAt(0).toUpperCase() + name.slice(1); 
     var url = name.match(/s$/) ? name.toLowerCase() : name.toLowerCase() + "s"; 
     allFields.val(""); tips.text(""); 

     $("#dialog-form-" + name).dialog($.extend(default_dialog_options, { 
      title: title, 
      buttons: [ 
       { // Add Button 
        text: title, 
        click: function(){ 
         var bValid = true; 
         allFields.removeClass("ui-state-error"); 

         var data = {}; 
         $("#dialog-form-" + name + " input[type=text]").each(function() { // each is fine for small loops :-) 
          var stripped_name = this["name"].replace(name + "_", ""); 
          data[name + "[" + stripped_name + "]"] = $("#dialog-form-" + name + " #" + name + "_" + stripped_name).val(); 
         }); 

         // verify required fields are set 
         $("#dialog-form-" + name + " input[type=text].required").each(function() { 
          bValid = bValid && checkLength($(this), $(this).attr("name").replace("_", " "), 3, 64); 
         }); 

         // find sliders 
         $("#dialog-form-" + name + " .slider").each(function() { 
          data[name + "[" + $(this).attr("data-name") + "]"] = $(this).slider("option", "value"); 
         }); 

         data["trip_id"] = trip_id; 
         if(options != null) { $.extend(data, options); } // add optional key/values 
         if(bValid) { 
          $(".ui-button").attr("disabled", true); 
          $.ajax({ url : "/" + url, type : "POST", data : data }); 
         } 
        } 
       }, 
       { text: "Cancel", click: function(){$(this).dialog("close");} } 
      ] 
     })); 
    } 
+3

あなたは何をしようとしているのか分かりません。 – xj9

+0

データの代わりに方向を使用してみませんか? like var direction = {name:name.val()、...} – user347594

+0

渡された変数の名前にアクセスできる関数を書くのは簡単ではないようです:http://stackoverflow.com/questions/1009911/javascript -get-argument-value-and-passed-of-passed-variable-variable –

答えて

4

あなたがここで欲しいものは本当に不明です。おそらく、必要な関数へのインタフェースと、いくつかのサンプル変数を設定し、関数を呼び出すコードの例を与えるべきでしょう。

directions_namedirections_start_addressのように、すでに環境内で宣言している変数を動的に検索し、それぞれにval()メソッドを呼び出して、その結果しかし、辞書のキーにはJavaScript構文が含まれています。あなたはそれがあなたが望んでいると確信していますか?

function transform(name) 
{ 
    var data = {}; 
    var names = window[name]; 
    for (var i=0; i<names.length; i++) 
    { 
     data[name + "[" + names[i] + "]"] = window[name + "_" + names[i]].val(); 
    } 
    return data; 
} 

編集は:

function transform(name) 
{ 
    var data = {}; 
    var names = $("#" + name); 
    for (var i=0; i<names.length; i++) 
    { 
     data[name + "[" + names[i] + "]"] = $("#" + name + "_" + names[i]).val(); 
    } 
    return data; 
} 

これで名前を検索します:(名前でグローバル変数を検索します)の代わりに上記のアプローチのIDでオブジェクトをルックアップするためにjQueryのを使用するにはウィンドウのグローバルスペース(これはブラウザで動作します)。その関数を "directions"を引数として呼び出します。例:

var directions = [ "name", "start_address", "end_address", "order_date" ]; 
var directions_name = {"val": function() {return "Joe";}}; 
var directions_start_address = {"val": function() {return "14 X Street";}}; 
var directions_end_address = {"val": function() {return "12 Y Street";}}; 
var directions_order_date = {"val": function() {return "1/2/3";}}; 
data = transform("directions"); 

これは何ですか?

は(注:?私は他の誰かが$"#"を用いて溶液を掲載...私はこれはjQueryのなしで働く権利、それはjQueryの構文だと思う参照。)

編集:これはあなたが使用することができますことに注意してください「方向」の動的値。しかし、私はまだ"directions[name]""directions[start_address]""name""start_address"などの代わりにそれらのキーが必要な理由についてはまだよく分かりません。

を編集します。値に関数を使用するようにサンプルコードを修正しました。これは本当にあなたが望むものですか? val()に括弧をつけて呼び出していない方が簡単です。

+0

入力いただきありがとうございます。うん、それはかなり複雑です。ここに私がやろうとしていることがあります。基本的には、JQuery UIを使用していくつかのフォームを作成します。次に、これらのフォームは.AJAXとPOSTデータをサーバーに呼び出します。私は同じコードを何度も何度も繰り返しています。唯一の違いは、アクセスするフィールドだけです。フォームAは方向です。フォームBはマップなどです。これらのAJAXデータオプションを動的に構築して、フォームを動的に構築するための1つの機能を持つことができます。それは理にかなっていますか?必要に応じてさらにコードを投稿することができます。 – cbmeeks

+0

私は参照してください。たとえば、変数 'directions_name'は' val() 'メソッドがデータを検索するオブジェクトなので、' val() 'を呼び出しています。 次に、SLaksが示唆しているように、 'window'のものを '$("#... ")'に置き換えることができます。それはIDでこれらのことを調べるべきです。私のソリューションを使用して、 'window [name]'を '$("# "+ name")に置き換えてください。 また、出力ディクショナリに "directions"という名前を付ける理由も説明しています。大括弧の代わりにアンダースコアを使用することを検討することもできます。 – mgiuca

+0

もう一度ありがとうございます。私はそのショットを与えるだろう。大括弧は、私がレールアプリに投稿しているためです。 – cbmeeks

1

var data = { }; 
for(var i = 0; i < directions.length; i++) { 
    var name = directions[i]; 
    data["directions[" + name + "]"] = $('#directions_' + name).val(); 
} 

あるいは、

data["directions[" + name + "]"] = directionsElements[name].val(); 

EDIT:あなたは配列を渡すことができ、これは(興味のある人のために)私がやってしまったものです接頭辞。

関連する問題