2016-03-23 22 views
0

HTML tablosundaki sütunları sıralamak için kullandığım bir kod parçam var ve tarih alanları hariç .... mükemmel çalışıyor. Alfabe ve saf sayısal harika çalışıyor! ancak bir tarih sütununda kullanıldığında, sıralayıcı istediğim gibi çalışmıyor. Şu tarihler şöyle sıralanmış almak:Eklentisiz Javascript sıralama tarihi

01-02-2016

02-01-2016

12-12-2014

12-14-2015

Olmak istediklerim:

12-12-2014

12-14-2015

01-02-2016

İşte

02-01-2016

Ben bu tür yapmak için kullandıkları bir JavaScript olup Şu anda çalışır:

:

var tb, asc1 = 1, 
    asc2 = 1, 
    asc3 = 1, 
    asc4 = 1, 
    asc5 = 1, 
    asc6 = 1; 

     function sort_table(tbody, col, asc) { 
     var rows = tbody.rows, 
       rlen = rows.length, 
       arr = new Array(), 
       i, j, cells, clen; 
     // fill the array with values from the table 
     for (i = 0; i < rlen; i++) { 
      cells = rows[i].cells; 
      clen = cells.length; 
      arr[i] = new Array(); 
      for (j = 0; j < clen; j++) { 
      arr[i][j] = cells[j].innerHTML; 
      } 
      } 
     // sort the array by the specified column number (col) and order (asc) 
      arr.sort(function (a, b) { 
       return (a[col] == b[col]) ? 0 : ((a[col] > b[col]) ? asc : -1 * asc); 
      }); 
     // replace existing rows with new rows created from the sorted array 
      for (i = 0; i < rlen; i++) { 
       rows[i].innerHTML = "<td>" + arr[i].join("</td><td>") + "</td>"; 
      } 
     } 

onclick işlevi şudur

function test() { 
    sort_table(tb, 0, asc1); asc1 *= -1; asc2 = 1; asc3 = 1; asc4 = 1; asc5 = 1; asc6 = 1; 
}; 

Bunun nasıl gerçekleşebileceğine dair herhangi bir öneriniz var mı? Javascript için gerçekten yeni ve hala hergün öğreniyorum! Örneğimden söyleyemediyseniz tarih formatı mm-dd-yyyy'dir. Herhangi bir yardım büyük takdir edilecektir!

o ben durdurana kadar bu tam bir örnek çalışma var ama ben kendi kodunda bunun dahil olamaz gibi ben Daniel Almeida kodu benimsedik

GÜNCELLEME. Yaptığım sıralarda düzensiz ve her yerde görünüyor.

var sorter = function(id, column, order, isDate) { 
    var t = document.getElementById(id); 
    var rows = Array.prototype.slice.call(t.rows, 0); 

    rows = rows.sort(function(a, b) { 

    var dtA = (isDate) ? new Date(a.cells[column].innerHTML) : a.cells[column].innerHTML; 
    var dtB = (isDate) ? new Date(b.cells[column].innerHTML) : b.cells[column].innerHTML; 

    return (order == 0) ? dtA > dtB : dtA < dtB; 

}); 

for (i = 0; i < rows.length; i++) { 
    t.appendChild(rows[i]); 
    } 

} 

Ben de bir jsfiddle yarattık ama ben hiç bir şey yapmak için jsfiddle alınamıyor: Şimdi aşağıdaki kodu ile çalışıyorum. Farkında olmadığım bir şeyi kaçırdığımı merak ediyor. İşte jsfiddle.

İki tablonun bölünmesinin nedeni, alt tablonun dinamik olarak yüklenmesidir ve kapsayıcı div, 100 döndürülen kayıt olduğunda uzun bir bilgi listesi yerine kaydırma penceresine izin verir.

+0

Mağaza fiili tarih nesneleri kontrol etmek ve o sıralamak. Görüntülenmeleri gerektiğinde yalnızca tarih nesnelerini dizelere dönüştürün. – forgivenson

cevap

1

İlk örnekte bu cevaba bakınız: sort table

var sorter = function(td, id, column, isDate) { 

    var tbl = document.getElementById(id); 
    var rows = Array.prototype.slice.call(tbl.rows, 0); 

    var order = td.getAttribute("order") == "asc" ? "desc" : "asc"; 
    td.setAttribute("order", order); 

    rows = rows.sort(function(a, b) { 

     var valA = a.cells[column].innerText; 
     var valB = b.cells[column].innerText; 

     var compA = (isDate) ? new Date(valA) : valA; 
     var compB = (isDate) ? new Date(valB) : valB; 

     if (order == "asc") { 
     if (compA < compB) return -1; 
     if (compA > compB) return 1; 
     } 

     if (order == "desc") { 
     if (compA > compB) return -1; 
     if (compA < compB) return 1; 
     } 

     return 0; 

    }); 

    for (i = 0; i < rows.length; i++) { 
     tbl.appendChild(rows[i]); 
    } 

    } 

DÜZENLEME: yerine dizeleri sıralama, bu keman working with date and text, asc and desc

+0

Bu tam olarak istediğimi yapıyor ama bunu yukarıdaki koduma nasıl dahil edeceğimi anlayamıyorum. Hem metin sütunları hem de tarih sütunlarını sıralamak istiyorum. İstenen etkiyi elde etmek için ikisini nasıl birleştirebileceğime dair bir fikrin var mı? Ben yeniyim bu yüzden gerçekten basit bir şeye baktığımı tahmin ediyorum ... –

+0

türünü parametre olarak gönder .. iyi çalışmalı .. '(id, sütun, düzen, tür)' ve bugüne dönüştürmeden önce kontrol et .. ' var dtA = (tip == "tarih")? Yeni Tarih (a.cells [column] .innerHTML): a.cells [column] .innerHTML; ' –

+0

Bu kod parçasını ekledim ama bu tarihler bir tarih yerine bir sayı olarak sıralamak için geri dönmüş gibiydi. İşte jsfiddle: [link] (https://jsfiddle.net/5guypvhq/). Bu mektup sütun üzerinde mükemmel çalışır ama tarih değil ... –

1

Javascript'in Date nesnesinde yerleşik nesnesini kullanın.tarih nesnenin bir dizi kolayca aynen böyle sıralanabilir:

var array = [ 
    new Date("01/02/2016"), 
    new Date("02/01/2016"), 
    new Date("12/12/2014"), 
    new Date("12/14/2015") 
]; 
array.sort(); 
+0

Bence temiz çözüm! –

+0

Bu olabilir, ancak dizi sadece tarihlerden daha fazlasını içerir. Metin sütunları ve varchar sütunları da vardır. –

0

Sen

var arr = [];

arr[i]= new Date(item_date_string).getTime();

Sen tamsayı dizi sıralayabilirsiniz her öğe için tarih nesneden zaman alabilir değerleri, daha sonra eşit tarih dizeleri dizisini doldurun

0

Tarihleri ​​ayırmak için jquery eklentisini kullanmak isterseniz Ayrıca sort date in html table using jquery

+0

Özellikle bir eklenti kullanmak istemediğimi söyledim ... –