2013-04-25 2 views
11

Desidero selezionare un sottoinsieme di tds da una tabella.Utilizzare jQuery per selezionare più elementi con .eq()

So in anticipo quali sono gli indici, ma sono effettivamente casuali (non indici dispari o pari, ecc.).

Ad esempio, dire che voglio selezionare il 0 °, il 5 ° e il 9 ° td.

indexesToSelect = [0, 5, 9]; 

// 1) this selects the one by one 
$('table td').eq(0) 
$('table td').eq(5) 
$('table td').eq(9) 


// 2)this selects them as a group (with underscore/lodash) 
var $myIndexes = $(); 

_.forEach(indexesToSelect, function (idx) { 
    $myIndexes = $myIndexes.add($('table td').eq(idx)); 
}); 

So (2) funziona e sto usando, ma mi chiedo se c'è un modo più naturale utilizzando jQuery.

Qualcosa come passare .eq() una matrice di indici? (Che non funziona)

// does not work 
$('table td').eq([0, 5, 9]) 

Se non scriverò un piccolo plug-in per qualcosa come .eqMulti (array).

nota: non esiste una classe che questi tds condividono esclusivamente, quindi la selezione in base alla classe non funzionerà.

risposta

16

mi piacerebbe farlo con .filter() e $.inArray():

var elements = $("table td").filter(function(i) { 
    return $.inArray(i, indexesToSelect) > -1; 
}); 

Un altro [più brutto] modo è mappatura ad un selettore:

var elements = $($.map(indexesToSelect, function(i) { 
    return "td:eq(" + i + ")"; 
}).join(","), "table"); 
+0

Penso che il primo sia piuttosto bello. – Jai

+0

Il filtro sembra quello che voglio, grazie. – Sean

2

provare questo

$('table td:eq(0), table td:eq(5), table td:eq(9)') 
+0

Beh, questo lo farà, ma la serie di indici che voglio non è costante. Avrebbe bisogno di una funzione per tradurre l'array in una stringa come quella che si dà qui. Ma per gli indici conosciuti questo è buono. – Sean

6

Ho avvolto il metodo di filtro di VisioN in un jQuer y plugin:

$.fn.eqAnyOf = function (arrayOfIndexes) { 
    return this.filter(function(i) { 
     return $.inArray(i, arrayOfIndexes) > -1; 
    }); 
}; 

Così ora l'uso è bello e pulito:

var $tds = $('table td').eqAnyOf([1, 5, 9]); 
+0

Bello! Ha funzionato bene nel mio nuovo progetto. – AshHimself

+0

Questo è fantastico - grazie. – cheshireoctopus

2
$('table td').filter(':eq(' + indexesToSelect.join('), :eq(') + ')')