2010-12-01 99 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() 
} 

通知格局。數組「名稱」的名稱是值的前綴。 我很感興趣人們如何能夠做到這一點,或至少建議一種方法讓我嘗試。

任何提示將不勝感激。

謝謝!

編輯**

感謝迄今建議。但是,我忘記提到陣列「方向」需要動態。

例如,我可以使用:

 
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); 

希望是有道理的。

**編輯* ** * ** * ** * ****

我要感謝大家的幫助。我最終走了一條不同的路線。思考完後,我決定在HTML表單本身中添加一些元信息。而且,我堅持命名約定。因此,HTML表單具有它需要的信息(無需臃腫)告訴jQuery POST信息的位置。這是我落得這樣做(對於那些有興趣):

 
    // 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 2010-12-01 03:31:58

+0

爲什麼不使用方向而不是數據?像這樣var direction = {name:name.val(),...} – user347594 2010-12-01 03:45:34

回答

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; 
} 

編輯:使用jQuery的ID,而不是上述方法(其中通過名稱查找全局變量)來查找對象:

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; 
} 

這將查找名稱中窗口的全局空間(無論如何將在瀏覽器中工作)。你用「方向」作爲參數調用該函數。例如:

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()與parens會更容易。

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(); 

編輯:你可以傳遞一個數組和一個字首。