2012-04-03 2 views
0

확인란 이름과 값의 개체를 가져 오려고합니다. 나는이 양식이 있다고 가정 :체크 상자 값 obj를 반환합니다.

<form> 
<input type="checkbox" name="email" /> 
<input type="checkbox" name="name" /> 
<input type="checkbox" name="hi" /> 

그리고 첫 번째와 세 번째가 선택되었는지 가정 할 때, 나는이 obj와 원하는 :

$(':checkbox').map(function() { return this.name + '=' + (this.checked ? 1 : 0) } }).get(); 

을 그리고 그 제공 :

여기
{ email: 1, name: 0, hi: 1 } 

내가 뭘하려입니다 나를 :

['email=1', 'name=0', 'hi=1'] 

하지만 난 ' 여기에서 뭘해야하는지 알지.

내가 잘못 생각하고 있습니까?

답변

4

따르면 the .map() method doco에, .map() 반환 "는 jQuery를 감싸 배열". 객체를 원하는 점을 감안 대신 같은 것을 수행 할 수 있습니다

var checkboxes = {}; 
$(':checkbox').each(function() { 
    checkboxes[this.name] = this.checked ? 1 : 0; 
}); 

주목을 그 다음 개체는 값을 유지합니다 당신은 (지금까지 HTML 양식이 가서으로 유효한) 같은 이름을 가진 체크 박스가있는 경우 각 이름에 대한 마지막 체크 박스

+0

Upvoted를 해결 마이너스 내 꾸짖는을 위해. :) – zetlen

1

당신은 연관 배열 구문을 사용하여 속성을 설정하려고 할 수 있습니다 ob["property"] = ...

이 작업 바이올린을 참조하십시오 http://jsfiddle.net/tuando/JwYFz/

1

예, 당신은 꽤 잘못 될 것입니다. '='을 사용하여 함수가 eval을 사용하여 실행되는 JavaScript 코드를 반환 할 것으로 예상되는 것처럼 보입니다. JavaScript가 작동하는 방식이 아닙니다. this.name을 문자열과 숫자로 연결 했으므로 JavaScript는 암시 적으로 type coercion을 수행하고 함수에서 문자열을 반환하므로 문자열 배열을 얻습니다.

.map() 함수는 항상 배열을 반환합니다. 배열을 반환하지 않는 기타 연산의 경우 일반 .each() 반복자를 사용해야합니다.

다음은 원하는대로하는 빠른 플러그인입니다.

$.fn.serializeCheckboxes = function() { 

    var ret = {}; 
    this.each(function(ix,elm) { 
     ret[elm.name] = elm.checked ? 1 : 0; 
    }); 
    return ret; 
} 
1

이 시도 :

$('input[type="checkbox"]').each(function() { 
     var name = $(this).attr('name'); 
     obj[name] = $(this).is(':checked') ? 1 : 0; 
}); 

http://jsfiddle.net/T7fja/1/

+1

'$ (this)'로 새로운 jQuery 객체 (두 번!)를 생성하는 대신'this.name'와'this.checked'를 사용하면 더 효율적이고 읽기 쉽도록 할 수 있습니다. – nnnnnn