2010-12-01 4 views
2

의 내가 있다고 가정 해 봅시다 :이에 해당 배열을 설정하는 매끄러운, 빠른 방법을 찾기 위해 노력하고있어Javascript challenge. 배열로 어떻게 이것을 할 수 있습니까?

 
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"는 값의 접두사입니다. 나는 사람들이이 일을 할 수있는 방법이나 적어도 내가 시도 할 수있는 방법을 제안 할 수있는 방법에 관심이있다.

팁을 주시면 감사하겠습니다.

감사합니다.

편집 ** 지금까지 제안

감사합니다. 그러나 배열 "길 찾기"가 동적이어야한다는 점을 잊어 버렸습니다.

예를 들어, 내가 사용할 수 있습니다

 
places = ["name", "location"] 

그래서 기본적으로

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

를 반환해야

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

을 반환해야 그냥 함수로 배열을 전달할 수 그 데이터 객체를 반환합니다.

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

희망이 있습니다.

** 편집 * ** * ** * ** * **** 내가 그들의 도움을 모두 감사드립니다

. 나는 다른 길로가는 것을 끝내었다. 그것에 대해 생각한 후에 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-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와 사용 윈도우의 글로벌 공간 (어쨌든 브라우저에서 작동). "방향"을 인수로 사용하여 해당 함수를 호출합니다. 예 :

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를 부르지 않으면 더 쉬울 것입니다.

+0

입력 해 주셔서 감사합니다. 응, 꽤 복잡해. 여기 내가하려는 일이 있습니다. 기본적으로 JQuery UI를 사용하여 일부 양식을 작성합니다. 그런 다음이 양식은 .AJAX 및 POST 데이터를 서버에 호출합니다. 나는 여러 가지 형태로 반복해서 같은 코드를 반복한다. 유일한 실제 차이는 그들이 액세스하는 필드입니다. 형태 A는 길 찾기입니다. 양식 B는지도 등입니다. 동적으로 양식을 작성하는 기능을 하나 갖출 수 있도록 이러한 AJAX 데이터 옵션을 동적으로 작성하려고합니다. 그게 더 합리적입니까? 필요한 경우 더 많은 코드를 게시 할 수 있습니다. – cbmeeks

+0

나는 본다. 따라서'directions() '변수는'val()'메서드가 데이터를 찾는 객체이기 때문에'val()'을 호출합니다. 그러면 SLaks가 제안한대로'window '를'$ ("# ...")'로 대체 할 수 있습니다. 그것은 ID로 이러한 것들을 찾아야합니다. 내 솔루션을 사용하지만'window [name]'을'$ ("#"+ name ")으로 대체하십시오. 또한 왜 "출력"이라는 이름을 출력 사전에 넣는 지 설명합니다. 대괄호 대신 밑줄을 사용하는 것이 좋습니다. – 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(); 

편집 : 당신은 배열을 전달할 수 있으며, 이것은 (관심있는 사람들을 위해) 내가하고 결국 무엇인가 접두사.

관련 문제