2012-06-20 5 views
15

Czy istnieje sposób określenia lub obliczenia, czy i jak można normalizować tabelę HTML za pomocą wierszy? Lub jeśli istnieje biblioteka JavaScript, która może to zrobić."Normalizuj" tabelę HTML z przedziałem wierszy

Np ta tabela:

+-----------+---------+ 
| Apple  | Red  | 
| Apple  | Green | 
| Apple  | Yellow | 
| Sun  | Yellow | 
| Sun  | Hot  | 
| Charizard | Hot  | 
| Charizard | Pokémon | 
+-----------+---------+ 

Czy zamieni się w ten sposób:

+-----------+---------+ 
| Apple  | Red  | 
|   | Green | 
|   |---------| 
|-----------| Yellow | 
| Sun  |-------- | 
|-----------| Hot  | 
|   |---------| 
| Charizard | Pokémon | 
+-----------+---------+ 

Spójrz na to skrzypce, aby zobaczyć, co mam na myśli: http://jsfiddle.net/scorch/LZKkQ/

Niektóre z tych kombinacji są łatwe ręcznie, ale niektóre mogą być dość skomplikowane. Chciałbym jak najbardziej zminimalizować tabelę i upewnić się, że nie ma innej kombinacji, która mogłaby zminimalizować to. Tj., Najlepiej tylko unikalne wartości w tabeli.

EDYCJA: Nieważne dodatkowe kolumny w skrzypcach. Wygląda na to, że firefox ma pewne problemy z rowspanem w kolumnie po prawej stronie, więc musiałem dodać kolejną, aby uzyskać pożądany efekt.

EDIT 2:

W DataTables plugin fnMultiRowspan i fnFakeRowspan wymienione poniżej naprawdę nie uzyskania pożądanych wyników. Obie wtyczki wymagają wcześniejszego posortowania stołu we właściwy sposób; fnFakeRowspan działa tylko na jednej kolumnie i fnMultiRowspan daje wynik poniżej (gorącej i żółty są duplikowane w drugiej kolumnie):

+-----------+---------+ 
|   | Red  | 
| Apple  | Green | 
|   | Yellow | 
|-----------+---------| 
| Charizard | Hot  | 
|   | Pokémon | 
|-----------+---------| 
| Sun  | Yellow | 
|   | Hot  | 
+-----------+---------+ 
+4

próbowałeś pisanie go samodzielnie? –

+1

Tak, istnieje biblioteka jquery [Datatable] (http://datatables.net), która posiadała tę funkcję: [Wizualnie grupuje dwie lub więcej komórek w rzędzie z tą samą zawartością] (http://datatables.net/plug-ins/api # fnFakeRowspan) –

+0

Próbowałem znaleźć matematyczny sposób, aby to zrobić, ale nie mogę znaleźć sposobu na zrobienie z tego równania. – Oscar

Odpowiedz

1

Jak wspomniano powyżej @MahmoudGamal w komentarzach, jest plug-in dla jQuery o nazwie DataTables że może być użyteczne. Sprawdzeniu funkcji fnFakeRowspan:

Tworzy komórek rowspan w kolumnie gdy istnieją dwie lub więcej komórek w rzędzie, w takiej samej zawartości, skutecznie zgrupowanie wizualnie. Uwaga: ta wtyczka działa obecnie poprawnie tylko z przetwarzaniem po stronie serwera.

Na podstawie szybkiego odczytania kodu wygląda na to, że podajesz kolumnę, następnie wyszukuje duplikaty i łączy komórki według potrzeb. (Uwaga: sam nie próbowałem tego kodu.)

+0

Hm, robi się mniej więcej w połowie. Próbowałem już, i to tylko obsługiwane to do jednej kolumny, a nie wielu. Również stół musi zostać posortowany we właściwej kolejności, aby mógł zadziałać. Na forach istniało kilka odmian wtyczki, ale żadna z nich nie wykonała zadania. Mimo to, dzięki, mógłbyś rzucić okiem na to i zobaczyć, czy uda mi się zrobić to, co chcę z pewnymi modyfikacjami. – Oscar

+0

NIE, obsługuje wiele kolumn. ale musisz jeszcze raz wywołać 'fnFakeRowspan()'. –

0

Byłoby łatwo napisać to sam, jeśli rozumiesz wystarczająco JavaScript. Wszystko, co musisz zrobić, to sprawdzić, czy następny ciąg jest taki sam jak bieżący ciąg znaków, a następnie po prostu zwiększyć wysokość jednego zamiast dwukrotnie go drukować.

Edit: Więc czego chcesz to skończyć jak

+-----------+---------+ 
| Apple  | Red  | 
| Pokémon | Green | 
| Sun  | Yellow | 
| Charizard | Hot  | 
+-----------+---------+ 
+0

Cóż, najpierw należy go sortować. I nie tylko 'kolumna1 asc, kolumna2 asc', ponieważ może to nie być optymalny sposób ułożenia (jak w przykładowej tabeli powyżej), ponieważ druga kolumna również musi być ustawiona w wierszu. Bardziej optymalne ustawienie można uzyskać przesuwając rzędy po wstępnym sortowaniu. – Oscar

+0

Sprawdź moją odpowiedź edytuj –

+0

Niezupełnie. Sprawdź tabelę "W takim przypadku zostanie zmieniona:" w pytaniu. – Oscar