jQuery तालिका सॉर्ट


177

मेरे पास 4 कॉलम के साथ एक बहुत ही सरल HTML तालिका है:

Facility Name, Phone #, City, Specialty

मैं चाहता हूं कि उपयोगकर्ता केवल सुविधा नाम और शहर के आधार पर छाँट सके

मैं jQuery का उपयोग करके इसे कैसे कोड कर सकता हूं?


मेरा वोट - TinyTable
redsquare

जवाबों:


152

यदि आप सभी घंटियाँ और सीटी बजाना चाहते हैं तो मैं इस सरल sortElementsप्लगइन का सुझाव दे सकता हूँ । उपयोग:

var table = $('table');

$('.sortable th')
    .wrapInner('<span title="sort this column"/>')
    .each(function(){

        var th = $(this),
            thIndex = th.index(),
            inverse = false;

        th.click(function(){

            table.find('td').filter(function(){

                return $(this).index() === thIndex;

            }).sortElements(function(a, b){

                if( $.text([a]) == $.text([b]) )
                    return 0;

                return $.text([a]) > $.text([b]) ?
                    inverse ? -1 : 1
                    : inverse ? 1 : -1;

            }, function(){

                // parentNode is the element we want to move
                return this.parentNode; 

            });

            inverse = !inverse;

        });

    });

और एक डेमो। (सॉर्ट करने के लिए "शहर" और "सुविधा" कॉलम-हेडर पर क्लिक करें)


6
डेमो टूट गया था क्योंकि प्लगइन का स्थान बदल गया था। मैंने डेमो सॉर्ट करने के लिए एक निश्चित jsfiddle को कांटा लगाया है जो कम से कम मेरे लिए काम करने लगता है :) @ 999 शायद आप निश्चित डेमो से लिंक करने के लिए अपना जवाब अपडेट कर सकते हैं?
जेक वॉरेल 15

2
यदि आपके पेज पर कई टेबल हैं तो क्या होगा? मैंने jsfiddle jsfiddle.net/CM8bT
Marc

1
मुझे यह त्रुटि मिल रही है Error: illegal characterकि html बिल्कुल समान नहीं है, मेरे पास थ्रेड और टोबे भी हैं, क्या आप कृपया मुझे इसमें मदद कर सकते हैं?
प्रात:

1
केस संवेदनशीलता के मामले में उपरोक्त फ़ंक्शन काम नहीं करेगा। इस प्लगइन में 'a'! = 'A'। यदि पाठ को अपरकेस या लोअर केस में परिवर्तित करना और फिर जांचना और तुलना करना काम करेगा। जैसे: $.text([a]) == $.text([b])उपयोग $.text([a]).toUpperCase() == $.text([b]).toUpperCase()करने के बजाय इसे ठीक कर देंगे।
NBK

1
बहुत जल्द आप पाएंगे कि छँटाई बिल्कुल भी एक टेबल-विशिष्ट समस्या नहीं है - जब आप करते हैं, तो यहाँ मेरी नन्हा-नन्हा jQuery प्लग-इन है, जिसमें आरोही या अवरोही क्रम में सूचियाँ, तालिकाओं, विभाजनों या अन्य चीज़ों को क्रमबद्ध किया जाएगा। मैंने इसे अलग-अलग डेटा-प्रकारों जैसे कि मुद्रा या वर्ष के अनुसार सॉर्ट करने के लिए भी उपयोग किया है - बस अपना स्वयं का फ़ंक्शन प्रदान करें जो डेटा को सॉर्ट करने के लिए वापस करता है। (मैं उन कार्यों को अलग रखना पसंद करता हूं, और उन्हें सार्थक नाम देता हूं, "चीजों को सॉर्ट करने के तरीके" की अपनी छोटी सी लाइब्रेरी बनाने के लिए जो मेरे द्वारा बनाए जा रहे समाधान के लिए विशिष्ट हैं।)
mindplay.dk

184

मुझे यह पता चला, और मैंने सोचा कि मैं अपने 2 सेंट में फेंक दूंगा। आरोही क्रमबद्ध करने के लिए कॉलम हेडर पर क्लिक करें, और फिर अवरोही क्रमबद्ध करने के लिए।

  • क्रोम, फ़ायरफ़ॉक्स, ओपेरा और IE (8) में काम करता है
  • केवल JQuery का उपयोग करता है
  • अल्फा और न्यूमेरिक छँटाई करता है - आरोही और अवरोही

$('th').click(function(){
    var table = $(this).parents('table').eq(0)
    var rows = table.find('tr:gt(0)').toArray().sort(comparer($(this).index()))
    this.asc = !this.asc
    if (!this.asc){rows = rows.reverse()}
    for (var i = 0; i < rows.length; i++){table.append(rows[i])}
})
function comparer(index) {
    return function(a, b) {
        var valA = getCellValue(a, index), valB = getCellValue(b, index)
        return $.isNumeric(valA) && $.isNumeric(valB) ? valA - valB : valA.toString().localeCompare(valB)
    }
}
function getCellValue(row, index){ return $(row).children('td').eq(index).text() }
table, th, td {
    border: 1px solid black;
}
th {
    cursor: pointer;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<table>
    <tr><th>Country</th><th>Date</th><th>Size</th></tr>
    <tr><td>France</td><td>2001-01-01</td><td>25</td></tr>
    <tr><td><a href=#>spain</a></td><td>2005-05-05</td><td></td></tr>
    <tr><td>Lebanon</td><td>2002-02-02</td><td>-17</td></tr>
    <tr><td>Argentina</td><td>2005-04-04</td><td>100</td></tr>
    <tr><td>USA</td><td></td><td>-6</td></tr>
</table>

** अपडेट: २०१8


10
बहुत खुबस! बस ध्यान दें कि यदि आपके पास लिंक हैं td, जैसे <a href="#">Test</a>कि छँटाई का संबंध है <a...। केवल पाठ के आधार पर छाँटने के लिए आपको html()अंतिम पंक्ति में बदलना होगा text()
काई नैक

1
@wubblyjuggly - आपने क्या प्रयास किया है? वर्तमान में डेटा प्रकार (यानी संख्या या स्ट्रिंग) निर्धारित करने के लिए तालिका सेल डेटा (जैसे HTML मान) का उपयोग करती है। क्योंकि तारीख के तार कई स्वरूपों में आते हैं, इसलिए जेनेरिक डेट डिटेक्टर / पार्सर लिखना अव्यावहारिक है ( comparer(..)यदि आप वास्तव में जानते हैं कि आप किस प्रारूप का समर्थन करना चाहते हैं, तो आप फिर से लिख सकते हैं )। इस बीच, यदि आप उपयोग करते हैं, तो आपके लिए डेटा yyyy-MM-dd" string" क्रमबद्ध हो जाएगा। उदा। jsbin.com/pugedip/1
निक ग्रीली

1
इस उदाहरण ने मेरे लिए पूरी तरह से काम किया जहां चुना हुआ समाधान नहीं हुआ। चुना हुआ जवाब मेरे काम नहीं आया; मुझे यकीन नहीं है कि यह है क्योंकि मैं एक थ्रेड / tbody का उपयोग कर रहा हूं या नहीं (jsfiddle, इन टैग के बिना, काम किया था)।
राल्फइनवॉन्डरलामा

1
धन्यवाद @ जान, मैंने आपके सुझाव को समाधान में शामिल कर लिया है!
निक ग्रीली

1
@NickGrealy आप टिप्पणी में मेरे सुझाव सही हैं जहां अस्वीकार किए गए संपादित करें। की तुलना करें jsfiddle.net/gn1vtcLq/2 साथ (मेरी संस्करण) jsfiddle.net/0a15ky9u (अपने संस्करण)। Ids या नामों को अपने संस्करण में क्रमिक रूप से बदलते हुए अपने संस्करण में क्रमिक रूप से देखने के लिए कई बार "सेक्स" शीर्षक पर क्लिक करें।
मार्कस

39

अब तक, मैंने जो सबसे आसान प्रयोग किया है वह है: http://datatables.net/

आश्चर्यजनक सरल ... बस यकीन है कि अगर आप डोम प्रतिस्थापन मार्ग जाना (आईई, एक मेज के निर्माण और दे उसे पुन: प्रारूपित DataTables) बनाने के तो यकीन के साथ अपनी मेज फ़ॉर्मेट करने के लिए बनाने के <thead>लिए और <tbody>या यह काम नहीं करेगा। यह एकमात्र गोच के बारे में है।

AJAX आदि के लिए भी समर्थन है, कोड के सभी बहुत अच्छे टुकड़ों के साथ, यह सब बंद करना भी बहुत आसान है। आपको आश्चर्य होगा कि आप क्या उपयोग कर सकते हैं, हालांकि। मैंने एक "नंगे" डेटाटेबल के साथ शुरू किया जो केवल एक क्षेत्र को छाँटता था और फिर महसूस करता था कि कुछ विशेषताएं वास्तव में मैं क्या कर रहा हूँ के लिए प्रासंगिक था। ग्राहक नई सुविधाओं से प्यार करते हैं।

पूर्ण ThemeRoller समर्थन के लिए DataTables के लिए बोनस अंक ...।

मैं भी तालिकाओं के साथ ठीक भाग्य था, लेकिन यह लगभग उतना आसान नहीं है, बहुत अच्छी तरह से प्रलेखित नहीं है, और केवल ठीक विशेषताएं हैं।


4
सहमत यह एक अच्छी सुविधा संपन्न प्लगइन है जो संभवतः ओपी की आवश्यकता के लिए जटिलता और आकार के मामले में ओवरकिल है।
redsquare

2
+1 NuGet पर उपलब्ध होने के लिए: nuget.org/List/Packages/jquery.datatables
फ्रैंक वैन आइकेलेन

1
मैं भी मानता हूं, datatables.net सबसे अच्छा टेबल सॉर्टर / पेजिनेज़र / खोजकर्ता है। इसकी समृद्ध विशेषताओं ने मुझे बहुत समय बचाया। डेटेटेबल्स के बारे में पता करने से पहले मुझे केवल उस समय के लिए पछतावा है जो मैंने अपने कोड के लिए टेबल-कोड 2 प्लगइन को एकीकृत करने की कोशिश में किया है ...
लोगन

2
मुझे पता है कि यह एक पुराना धागा है लेकिन यह उत्तर अभी भी लागू होता है। शायद सबसे आसान प्लगइन जिसका मैंने कभी इस्तेमाल किया है। इसे पाने के लिए 5 मिनट लगे और मेरी टेबल को छांटा। धन्यवाद!
ट्रकटेक

स्थापित करने के लिए बहुत आसान है, सबसे अच्छा मैंने इस्तेमाल किया है।
रोज

18

हमने अभी इस स्लीक टूल का उपयोग शुरू किया: https://plugins.jquery.com/tablesorter/

इसके उपयोग पर एक वीडियो है: http://www.highoncoding.com/Articles/695_Sorting_GridView_Using_JQuery_TableSorter_Plug_in.aspx

    $('#tableRoster').tablesorter({
        headers: {
            0: { sorter: false },
            4: { sorter: false }
        }
    });

एक साधारण टेबल के साथ

<table id="tableRoster">
        <thead> 
                  <tr>
                    <th><input type="checkbox" class="rCheckBox" value="all" id="rAll" ></th>
                    <th>User</th>
                    <th>Verified</th>
                    <th>Recently Accessed</th>
                    <th>&nbsp;</th>
                  </tr>
        </thead>

15

मेरा जवाब "सावधान" होगा। बहुत सारे jQuery के टेबल-सॉर्टिंग ऐड-ऑन केवल उसी प्रकार को सॉर्ट करते हैं जो आप ब्राउज़र में पास करते हैं। कई मामलों में, आपको यह ध्यान रखना होगा कि टेबल डेटा के डायनामिक सेट हैं, और इनमें संभवतः डेटा की लाइनों के ज़िलियन हो सकते हैं।

आप उल्लेख करते हैं कि आपके पास केवल 4 कॉलम हैं, लेकिन इससे भी महत्वपूर्ण बात यह है कि आप यह उल्लेख नहीं करते हैं कि हम यहां कितनी पंक्तियों के बारे में बात कर रहे हैं।

यदि आप डेटाबेस से ब्राउज़र में 5000 लाइनें पास करते हैं, तो यह जानकर कि वास्तविक डेटाबेस-तालिका में 100,000 पंक्तियाँ हैं, मेरा सवाल है: तालिका को क्रमबद्ध बनाने में क्या बात है? एक उचित प्रकार करने के लिए, आपको क्वेरी को डेटाबेस में वापस भेजना होगा, और डेटाबेस (एक उपकरण जो वास्तव में डेटा को सॉर्ट करने के लिए डिज़ाइन किया गया है) को आपके लिए सॉर्टिंग करने दें।

आपके प्रश्न के सीधे उत्तर में, हालांकि, मेरे द्वारा आया सबसे अच्छा छँटाई ऐड-ऑन इंग्रिड है। कई कारण हैं कि मुझे यह ऐड-ऑन पसंद नहीं है ("अनावश्यक घंटियाँ और सीटी ..." जैसा कि आप इसे कहते हैं), लेकिन यह सॉर्ट के संदर्भ में सबसे अच्छी विशेषताओं में से एक है, यह है कि यह अजाक्स का उपयोग करता है, और doesn ' टी मान लें कि आपने पहले ही अपना डेटा छाँट लिया है, इससे पहले कि वह अपनी छँटाई करे।

मैं मानता हूं कि यह उत्तर शायद आपकी आवश्यकताओं के लिए ओवरकिल (और 2 साल से अधिक देर) है, लेकिन जब मेरे क्षेत्र के डेवलपर्स इस बिंदु को नजरअंदाज करते हैं तो मुझे गुस्सा आता है। इसलिए मुझे उम्मीद है कि कोई और इस पर चुटकी लेगा।

मैं अब बेहतर महसूस कर रहा हूं।


7

यह तालिका छाँटने का एक अच्छा तरीका है:

$(document).ready(function () {
                $('th').each(function (col) {
                    $(this).hover(
                            function () {
                                $(this).addClass('focus');
                            },
                            function () {
                                $(this).removeClass('focus');
                            }
                    );
                    $(this).click(function () {
                        if ($(this).is('.asc')) {
                            $(this).removeClass('asc');
                            $(this).addClass('desc selected');
                            sortOrder = -1;
                        } else {
                            $(this).addClass('asc selected');
                            $(this).removeClass('desc');
                            sortOrder = 1;
                        }
                        $(this).siblings().removeClass('asc selected');
                        $(this).siblings().removeClass('desc selected');
                        var arrData = $('table').find('tbody >tr:has(td)').get();
                        arrData.sort(function (a, b) {
                            var val1 = $(a).children('td').eq(col).text().toUpperCase();
                            var val2 = $(b).children('td').eq(col).text().toUpperCase();
                            if ($.isNumeric(val1) && $.isNumeric(val2))
                                return sortOrder == 1 ? val1 - val2 : val2 - val1;
                            else
                                return (val1 < val2) ? -sortOrder : (val1 > val2) ? sortOrder : 0;
                        });
                        $.each(arrData, function (index, row) {
                            $('tbody').append(row);
                        });
                    });
                });
            });
            table, th, td {
            border: 1px solid black;
        }
        th {
            cursor: pointer;
        }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<table>
        <tr><th>id</th><th>name</th><th>age</th></tr>
        <tr><td>1</td><td>Julian</td><td>31</td></tr>
        <tr><td>2</td><td>Bert</td><td>12</td></tr>
        <tr><td>3</td><td>Xavier</td><td>25</td></tr>
        <tr><td>4</td><td>Mindy</td><td>32</td></tr>
        <tr><td>5</td><td>David</td><td>40</td></tr>
    </table>

फिडल यहां पाया जा सकता है:
https://jsfiddle.net/e3s84Luw/

स्पष्टीकरण यहाँ पाया जा सकता है: https://www.learningjquery.com/2017/03/how-to-sort-html-table-using-jquery-code


यह बहुत ही साधारण तालक गतिशील तालिका डेटा (php + MariaDB) के साथ बहुत अच्छी तरह से काम करता है। धन्यवाद!
येल्लो

6

मुझे यह स्वीकार किया गया उत्तर पसंद है, हालांकि, शायद ही कभी आपको html को सॉर्ट करने की आवश्यकता होती है और न कि सॉर्टिंग दिशा को इंगित करने वाले आइकन जोड़ना पड़ता है। मैंने उत्तर के उपयोग के उदाहरण को स्वीकार किया और तय किया कि जल्दी से अपने प्रोजेक्ट में बूटस्ट्रैप जोड़कर, और निम्नलिखित कोड जोड़कर:

<div></div>

प्रत्येक के अंदर <th>ताकि आपके पास आइकन सेट करने के लिए एक जगह हो।

setIcon(this, inverse);

स्वीकार किए गए उत्तर के उपयोग से, रेखा के नीचे:

th.click(function () {

और setIcon विधि को जोड़कर:

function setIcon(element, inverse) {

        var iconSpan = $(element).find('div');

        if (inverse == false) {
            $(iconSpan).removeClass();
            $(iconSpan).addClass('icon-white icon-arrow-up');
        } else {
            $(iconSpan).removeClass();
            $(iconSpan).addClass('icon-white icon-arrow-down');
        }
        $(element).siblings().find('div').removeClass();
    }

यहाँ एक डेमो है । - आपको या तो फ़ायरफ़ॉक्स या IE में डेमो चलाने की ज़रूरत है, या काम करने के लिए क्रोम के MIME-प्रकार की जाँच अक्षम करें। यह सॉर्टलाइज़ प्लगिन पर निर्भर करता है, जो स्वीकृत उत्तर से जुड़ा होता है, बाहरी संसाधन के रूप में। बिलकुल चौकन्ना!



2

@ निक ग्रीली का जवाब बहुत अच्छा है, लेकिन यह rowspanटेबल हेडर कोशिकाओं की संभावित विशेषताओं को ध्यान में नहीं रखता है (और शायद अन्य उत्तर भी ऐसा नहीं करते हैं)। यहां @Nick Grealy के उत्तर का सुधार है जो इसे ठीक करता है। इस उत्तर के आधार पर भी (धन्यवाद @ ऑरंडोव)।

मैंने पुराने jQuery संस्करणों के साथ काम करने के लिए $.isNumericफ़ंक्शन को कस्टम एक (धन्यवाद @zad) के साथ बदल दिया है ।

इसे सक्रिय class="sortable"करने के लिए, <table>टैग में जोड़ें ।

$(document).ready(function() {

    $('table.sortable th').click(function(){
        var table = $(this).parents('table').eq(0);
        var column_index = get_column_index(this);
        var rows = table.find('tbody tr').toArray().sort(comparer(column_index));
        this.asc = !this.asc;
        if (!this.asc){rows = rows.reverse()};
        for (var i = 0; i < rows.length; i++){table.append(rows[i])};
    })

});

function comparer(index) {
    return function(a, b) {
        var valA = getCellValue(a, index), valB = getCellValue(b, index);
        return isNumber(valA) && isNumber(valB) ? valA - valB : valA.localeCompare(valB);
    }
}
function getCellValue(row, index){ return $(row).children('td').eq(index).html() };

function isNumber(n) {
  return !isNaN(parseFloat(n)) && isFinite(n);
}

function get_column_index(element) {
    var clickedEl = $(element);
    var myCol = clickedEl.closest("th").index();
    var myRow = clickedEl.closest("tr").index();
    var rowspans = $("th[rowspan]");
    rowspans.each(function () {
        var rs = $(this);
        var rsIndex = rs.closest("tr").index();
        var rsQuantity = parseInt(rs.attr("rowspan"));
        if (myRow > rsIndex && myRow <= rsIndex + rsQuantity - 1) {
            myCol++;
        }
    });
    // alert('Row: ' + myRow + ', Column: ' + myCol);
    return myCol;
};

अगर आप तिथि के अनुसार छँटाई करते हैं तो क्या होगा?
wubblyjuggly

@wubblyjuggly आप तुलनात्मक फ़ंक्शन को तिथियों की तुलना करने वाले एक के साथ बदल सकते हैं, उदाहरण के लिए देखें stackoverflow.com/questions/10636779/jquery-date-sorting
डेनिस गोलोमेज़ोव

1
ब्रावो, मैंने दर्जनों सॉर्टर्स की कोशिश की है, आपका केवल एक ही है जो मेरे लिए काम करता है। BTW मेरी तारीखें पाठ प्रारूप (२०२०.०२.२३) में हैं, इसलिए यह मेरे लिए कोई समस्या नहीं है
मैनी रामिरेज़

2

आप एक jQuery प्लगइन ( ब्रीडज ) का उपयोग कर सकते हैं जो सॉर्ट, फ़िल्टर और पेजिनेशन प्रदान करता है:

HTML:

<table>
  <thead>
    <tr>
      <th sort='name'>Name</th>
      <th>Phone</th>
      <th sort='city'>City</th>
      <th>Speciality</th>
    </tr>
  </thead>
  <tbody>
    <tr b-scope="people" b-loop="person in people">
      <td b-sort="name">{{person.name}}</td>
      <td>{{person.phone}}</td>
      <td b-sort="city">{{person.city}}</td>
      <td>{{person.speciality}}</td>
    </tr>
  </tbody>
</table>

जे एस:

$(function(){
  var data = {
    people: [
      {name: 'c', phone: 123, city: 'b', speciality: 'a'},
      {name: 'b', phone: 345, city: 'a', speciality: 'c'},
      {name: 'a', phone: 234, city: 'c', speciality: 'b'},
    ]
  };
  breed.run({
    scope: 'people',
    input: data
  });
  $("th[sort]").click(function(){
    breed.sort({
      scope: 'people',
      selector: $(this).attr('sort')
    });
  });
});

फिडल पर काम करने का उदाहरण


2

यह ब्राउज़र / एस को नहीं लटकाता है, आगे आसान विन्यास योग्य है:

var table = $('table');

$('th.sortable').click(function(){
    var table = $(this).parents('table').eq(0);
    var ths = table.find('tr:gt(0)').toArray().sort(compare($(this).index()));
    this.asc = !this.asc;
    if (!this.asc)
       ths = ths.reverse();
    for (var i = 0; i < ths.length; i++)
       table.append(ths[i]);
});

function compare(idx) {
    return function(a, b) {
       var A = tableCell(a, idx), B = tableCell(b, idx)
       return $.isNumeric(A) && $.isNumeric(B) ? 
          A - B : A.toString().localeCompare(B)
    }
}

function tableCell(tr, index){ 
    return $(tr).children('td').eq(index).text() 
}

1
यह सबसे अच्छा उपाय लगता है। यह एक प्लगइन की आवश्यकता नहीं है। पहली पंक्ति जिसे आप हटा सकते हैं, उसके बाद तैयार दस्तावेज़ में $ ('th.sortable') पेस्ट करें। क्लिक करें (...) ब्लॉक। टेबल हेडर्स को सॉर्टेबल क्लास दें और आप काम कर रहे हैं। <th class = 'Sortable> शीर्षक </ th>। पाठ या संख्या वाले स्तंभों के लिए आकर्षक काम करता है।
पीजामोनस्टर

1

जेम्स की प्रतिक्रिया के लिए मैं इसे और अधिक सार्वभौमिक बनाने के लिए केवल छँटाई समारोह को बदल दूंगा। इस तरह यह पाठ वर्णमाला और संख्याओं की तरह क्रमबद्ध हो जाएगा।

if( $.text([a]) == $.text([b]) )
    return 0;
if(isNaN($.text([a])) && isNaN($.text([b]))){
    return $.text([a]) > $.text([b]) ? 
       inverse ? -1 : 1
       : inverse ? 1 : -1;
}
else{
    return parseInt($.text([a])) > parseInt($.text([b])) ? 
      inverse ? -1 : 1
      : inverse ? 1 : -1;
}

1

HTML तालिका को सॉर्ट करने के लिए एक और तरीका। ( W3.JS HTML सॉर्ट पर आधारित )

/* Facility Name */
$('#bioTable th:eq(0)').addClass("control-label pointer");
/* Phone # */
$('#bioTable th:eq(1)').addClass("not-allowed");
/* City */
$('#bioTable th:eq(2)').addClass("control-label pointer");
/* Specialty */
$('#bioTable th:eq(3)').addClass("not-allowed");


var collection = [{
  "FacilityName": "MinION",
  "Phone": "999-8888",
  "City": "France",
  "Specialty": "Genetic Prediction"
}, {
  "FacilityName": "GridION X5",
  "Phone": "999-8812",
  "City": "Singapore",
  "Specialty": "DNA Assembly"
}, {
  "FacilityName": "PromethION",
  "Phone": "929-8888",
  "City": "San Francisco",
  "Specialty": "DNA Testing"
}, {
  "FacilityName": "iSeq 100 System",
  "Phone": "999-8008",
  "City": "Christchurch",
  "Specialty": "gDNA-mRNA sequencing"
}]

$tbody = $("#bioTable").append('<tbody></tbody>');

for (var i = 0; i < collection.length; i++) {
  $tbody = $tbody.append('<tr class="item"><td>' + collection[i]["FacilityName"] + '</td><td>' + collection[i]["Phone"] + '</td><td>' + collection[i]["City"] + '</td><td>' + collection[i]["Specialty"] + '</td></tr>');
}
.control-label:after {
  content: "*";
  color: red;
}

.pointer {
  cursor: pointer;
}

.not-allowed {
  cursor: not-allowed;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://www.w3schools.com/lib/w3.js"></script>
<link href="https://www.w3schools.com/w3css/4/w3.css" rel="stylesheet" />
<p>Click the <strong>table headers</strong> to sort the table accordingly:</p>

<table id="bioTable" class="w3-table-all">
  <thead>
    <tr>
      <th onclick="w3.sortHTML('#bioTable', '.item', 'td:nth-child(1)')">Facility Name</th>
      <th>Phone #</th>
      <th onclick="w3.sortHTML('#bioTable', '.item', 'td:nth-child(3)')">City</th>
      <th>Specialty</th>
    </tr>
  </thead>
</table>


1

मैं निक के जवाब का उपयोग कर समाप्त हो गया (सबसे लोकप्रिय लेकिन उसे स्वीकार नहीं) https://stackoverflow.com/a/19947532/5271220

और इसे https://stackoverflow.com/a/16819442/5271220 के साथ संयोजित किया लेकिन प्रोजेक्ट में आइकन या फ़ॉन्ट जोड़ना नहीं चाहते थे। सॉर्ट-कॉलम- asc / desc के लिए सीएसएस शैलियों मैंने रंग, पैडिंग, गोल बॉर्डर किया।

मैंने इसे कक्षा द्वारा जाने के लिए भी संशोधित किया, ताकि हम नियंत्रित कर सकें कि कौन से छांटे गए हैं। यह बाद में भी काम आ सकता है यदि दो तालिकाओं हों, हालांकि इसके लिए अधिक संशोधनों की आवश्यकता होगी।

तन:

 html += "<thead>\n";
    html += "<th></th>\n";
    html += "<th class=\"sort-header\">Name <span></span></i></th>\n";
    html += "<th class=\"sort-header\">Status <span></span></th>\n";
    html += "<th class=\"sort-header\">Comments <span></span></th>\n";
    html += "<th class=\"sort-header\">Location <span></span></th>\n";
    html += "<th nowrap class=\"sort-header\">Est. return <span></span></th>\n";
    html += "</thead>\n";
    html += "<tbody>\n"; ...

... शरीर को और नीचे गिरा दिया

$("body").on("click", ".sort-header", function (e) {
    var table = $(this).parents('table').eq(0)
    var rows = table.find('tr:gt(0)').toArray().sort(comparer($(this).index()))
    this.asc = !this.asc
    if (!this.asc) { rows = rows.reverse() }
    for (var i = 0; i < rows.length; i++) { table.append(rows[i]) }

    setIcon(e.target, this.asc);
});

कार्य:

function comparer(index) {
        return function (a, b) {
            var valA = getCellValue(a, index), valB = getCellValue(b, index)
            return $.isNumeric(valA) && $.isNumeric(valB) ? valA - valB : valA.toString().localeCompare(valB)
        }
    }

    function getCellValue(row, index) {
        return $(row).children('td').eq(index).text()
    }

    function setIcon(element, inverse) {

        var iconSpan = $(element).find('span');

        if (inverse == true) {
            $(iconSpan).removeClass();
            $(iconSpan).addClass('sort-column-asc');
            $(iconSpan)[0].innerHTML = " &#8593 " // arrow up
        } else {
            $(iconSpan).removeClass();
            $(iconSpan).addClass('sort-column-desc');
            $(iconSpan)[0].innerHTML = " &#8595 " // arrow down 
        }

        $(element).siblings().find('span').each(function (i, obj) {
            $(obj).removeClass();
            obj.innerHTML = "";
        });
    }

-4

मेरा वोट! jquery.sortElements.js और सरल jquery
बहुत सरल, बहुत आसान, धन्यवाद नंदप ...

            $('th').live('click', function(){

            var th = $(this), thIndex = th.index(), var table = $(this).parent().parent();

                switch($(this).attr('inverse')){
                case 'false': inverse = true; break;
                case 'true:': inverse = false; break;
                default: inverse = false; break;
                }
            th.attr('inverse',inverse)

            table.find('td').filter(function(){
                return $(this).index() === thIndex;
            }).sortElements(function(a, b){
                return $.text([a]) > $.text([b]) ?
                    inverse ? -1 : 1
                    : inverse ? 1 : -1;
            }, function(){
                // parentNode is the element we want to move
                return this.parentNode; 
            });
            inverse = !inverse;     
            });

Dei uma melhorada do código
एक कॉड बेहतर! सभी समय में सभी तालिकाओं के लिए फ़ंक्शन ... इसे देखें!
डेमो


3
एक शब्द को समझने में सक्षम नहीं होने के बावजूद, मैं दृढ़ता से इसके खिलाफ सिफारिश करूंगा .live()
अवतार
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.