2009-07-28 16 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」のために、それぞれの値が最初に出現しているすべてのチェックボックスを選択しています。だから私は次のような何かをしたい:

$('input [type=checkbox]') 

だけに何とかそれを拡張彼らはそれぞれmyatr(1、2及び3のそれらの値の最初のインスタンスであるとして、IDSのCHK1、chk3とchk6でア​​イテムを取得します)。以下のような

何か:

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

これは何とか可能ですか?

答えて

1

ゼッドのソリューションとは対照的にO(1)のルックアップを与える(ハッシュマップのように振る舞う)オブジェクトを使用して配列の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のビルド - を得ることができるとは思いませんセレクタで。しかし、これはコードのいくつかの行で簡単に取得することができます。

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

本当に配列はありません必須。オブジェクトをハッシュマップとして使用するだけで、より高速な結果を得ることができます。 –

関連する問題