2009-07-28 3 views
0

좋아, 내가 간결하게 원하는 것을 설명하는 방법을 잘 모르겠다. 그래서, 다음과 같은 의사 HTML을 :고급 jquery 선택 ... 속성 값 당 첫 번째

<input type=checkbox id=chk1 myatr=1 /> 
<input type=checkbox id=chk2 myatr=1 /> 
<input type=checkbox id=chk3 myatr=2 /> 
<input type=checkbox id=chk4 myatr=1 /> 
<input type=checkbox id=chk5 myatr=2 /> 
<input type=checkbox id=chk6 myatr=3 /> 

는 내가 뭘 원하는가 "myatr"에 대한 각각의 값이 처음으로 나타나는 모든 확인란을 선택합니다. 그들이 myatr (1, 2, 3의 그 값의 첫 번째 인스턴스가 각각 한, IDS의 CHK1, chk3 및 CHK6와 아이템을 얻을

$('input [type=checkbox]') 

만에 어떻게 든 확장 : 그래서 내가 뭔가를 먹고 싶어). 같은

뭔가 :

$('input [type=checkbox]').FirstForEach('myatr') 

이 어떻게 든 수 있습니까?

답변

1

데이빗의 솔루션 개체를 사용하여 (HashMaps을처럼 행동) O를 제공 (1) 조회 Array의 O (n) 조회.

var attrs = {}; 
var prefix = "blah$$"; 
$("input [type=checkbox]"). 
    filter(
    function() { 
     attr = this.attr("myatr"); 
     if (attrs[prefix + attr]) { 
     return false; 
     } else { 
     attrs[prefix + attr] = true; 
     return true; 
     } 
) 

접두어는 개체의 기본 제공 속성과의 충돌을 방지하는 데 사용됩니다.

+0

실제로 해시의 o (1)이 배열 액세스의 o (n)보다 아래로 내려가는 데 필요한 속성 목록의 길이를 측정하는 것은 흥미로운 일입니다. – Zed

+0

성능면에서 주목해야 할 것은 정말로 긴 배열 (1000+ 개) 요소 여야합니다. 그러나 사물들은이 목적을 위해서 옳습니다. 또한 array_contains 구현을 작성해야하는 추가 코드를 살펴보십시오. –

1

하지 우아한 솔루션,하지만 당신은 다음과 같이 수행 할 수 있습니다

var attrs = new Array(); 

$("input [type=checkbox]"). 
    filter(
    function() { 
     attr = this.attr("myatr"); 
     if (array_contains(attrs, attr)) { 
     return false; 
     } else { 
     array_insert(attrs, attr); 
     return true; 
     } 
). 
    ... 

array_contains 및 array_insert이 구현되어야한다 :

+0

JS에서'new Array()'를 사용하면 안된다. []] – RaYell

+0

그냥 array_insert (attrs, attr) 대신 attrs.push (attr)을 사용할 수있다. – montrealist

1

나는 당신이 방금 전화의 jQuery으로 Build-을 얻을 수 있다고 생각하지 않습니다를 셀렉터에서. 그러나 몇 줄의 코드에서 쉽게 얻을 수 있습니다.

var ids = []; 
$('input[type=checkbox]').filter(function (index) { 
    var attr = $(this).attr('myattr'); 
    if (ids.indexOf(attr) !== -1) { 
     ids[ids.length] = attr; 
     return true; 
    } 
    return false; 
}); 

테스트되었지만 작동해야합니다.

참고 : IE는 사항 Array.indexOf 방법은 구현하지 않습니다하지만 당신은 쉽게 코드로이 문제를 해결할 수 : 반대로

[].indexOf || (Array.prototype.indexOf = function(v){ 
    for (var i = 0; i < this.length; i++) { 
     if (v === this[i]) { 
      return i; 
     } 
    } 
    return -1; 
}); 
+0

배열은 실제로는 아니다. 필수. 더 빠른 결과를 얻으려면 객체를 해시 맵으로 사용할 수 있습니다. –