【问题标题】:Sorting items from highest to lowest项目从高到低排序
【发布时间】:2017-02-06 21:42:26
【问题描述】:

目标

我有一个点击功能,点击后会显示英语、数学、科学和社会研究的分数。我希望从最高到最低排序 .school 在该主题中的百分比最高。

  • 我想知道用 .sort()isotope.js

scripts.js

$(".btn").click(function(){
            $(".btn").removeClass("is-selected");
            $(this).addClass("is-selected");

                // Button behavior
                if ($(this).hasClass("btn-english")) {
                    $(".school__percentage").each(function(i, element) {
                        $(element).html(schools[i].percentEnglish);
                    });
                } else if ($(this).hasClass("btn-math")) {
                    $(".school__percentage").each(function(i, element) {
                        $(element).html(schools[i].percentMath);
                    });
                } else if ($(this).hasClass("btn-science")) {
                    $(".school__percentage").each(function(i, element) {
                        $(element).html(schools[i].percentScience);
                    });
                } else if ($(this).hasClass("btn-social")) {
                    $(".school__percentage").each(function(i, element) {
                        $(element).html(schools[i].percentSocial);
                    });
                }
            });

schools.js(有 20 所学校)

var schools = [
  {
    "name": "Maplewood Richmond Heights",
    "district": "Maplewood Richmond Heights",
    "crest": "src/img/crest-affton.jpg",
    "location": "",
    "percentEnglish": "1%",
    "percentMath": "21%",
    "percentScience": "41%",
    "percentSocial": "61%"
  }

index.html

<div class="widget high-school">
        <div class="widget__info">
            <p class="widget__category">High school</p>
            <p class="widget__title">Missouri Assessment Program standouts</p>
        </div>

        <div class="widget__buttons">
            <p class="widget__rank">Rank by:</p>
            <button class="btn btn-english is-selected">English</button>
            <button class="btn btn-math">Math</button>
            <button class="btn btn-science">Science</button>
            <button class="btn btn-social">Social Studies</button>
        </div>

        <div class="wrapper">
            <div class="schools">
                <div class="school" data-id="1">
                    <img src="" class="school__image">
                    <div class="school__details">
                        <div class="school__name">tk-name</div>
                        <div class="school__district">tk-district</div>
                    </div>
                    <div class="school__percentage">-%</div>
                </div> <!-- school -->

                <div class="school" data-id="2">
                    <img src="" class="school__image">
                    <div class="school__details">
                        <div class="school__name">tk-name</div>
                        <div class="school__district">tk-district</div>
                    </div>
                    <div class="school__percentage">-%</div>
                </div> <!-- school -->

                <div class="school" data-id="3">
                    <img src="" class="school__image">
                    <div class="school__details">
                        <div class="school__name">tk-name</div>
                        <div class="school__district">tk-district</div>
                    </div>
                    <div class="school__percentage">-%</div>
                </div> <!-- school -->

                <div class="school" data-id="4">
                    <img src="" class="school__image">
                    <div class="school__details">
                        <div class="school__name">tk-name</div>
                        <div class="school__district">tk-district</div>
                    </div>
                    <div class="school__percentage">-%</div>
                </div> <!-- school -->

                <div class="school" data-id="5">
                    <img src="" class="school__image">
                    <div class="school__details">
                        <div class="school__name">tk-name</div>
                        <div class="school__district">tk-district</div>
                    </div>
                    <div class="school__percentage">-%</div>
                </div> <!-- school -->

                <div class="school" data-id="6">
                    <img src="" class="school__image">
                    <div class="school__details">
                        <div class="school__name">tk-name</div>
                        <div class="school__district">tk-district</div>
                    </div>
                    <div class="school__percentage">-%</div>
                </div> <!-- school -->

                <div class="school" data-id="7">
                    <img src="" class="school__image">
                    <div class="school__details">
                        <div class="school__name">tk-name</div>
                        <div class="school__district">tk-district</div>
                    </div>
                    <div class="school__percentage">-%</div>
                </div> <!-- school -->

                <div class="school" data-id="8">
                    <img src="" class="school__image">
                    <div class="school__details">
                        <div class="school__name">tk-name</div>
                        <div class="school__district">tk-district</div>
                    </div>
                    <div class="school__percentage">-%</div>
                </div> <!-- school -->

                <div class="school" data-id="9">
                    <img src="" class="school__image">
                    <div class="school__details">
                        <div class="school__name">tk-name</div>
                        <div class="school__district">tk-district</div>
                    </div>
                    <div class="school__percentage">-%</div>
                </div> <!-- school -->

                <div class="school" data-id="10">
                    <img src="" class="school__image">
                    <div class="school__details">
                        <div class="school__name">tk-name</div>
                        <div class="school__district">tk-district</div>
                    </div>
                    <div class="school__percentage">-%</div>
                </div> <!-- school -->

                <div class="school" data-id="11">
                    <img src="" class="school__image">
                    <div class="school__details">
                        <div class="school__name">tk-name</div>
                        <div class="school__district">tk-district</div>
                    </div>
                    <div class="school__percentage">-%</div>
                </div> <!-- school -->

                <div class="school" data-id="12">
                    <img src="" class="school__image">
                    <div class="school__details">
                        <div class="school__name">tk-name</div>
                        <div class="school__district">tk-district</div>
                    </div>
                    <div class="school__percentage">-%</div>
                </div> <!-- school -->

                <div class="school" data-id="13">
                    <img src="" class="school__image">
                    <div class="school__details">
                        <div class="school__name">tk-name</div>
                        <div class="school__district">tk-district</div>
                    </div>
                    <div class="school__percentage">-%</div>
                </div> <!-- school -->

                <div class="school" data-id="14">
                    <img src="" class="school__image">
                    <div class="school__details">
                        <div class="school__name">tk-name</div>
                        <div class="school__district">tk-district</div>
                    </div>
                    <div class="school__percentage">-%</div>
                </div> <!-- school -->

                <div class="school" data-id="15">
                    <img src="" class="school__image">
                    <div class="school__details">
                        <div class="school__name">tk-name</div>
                        <div class="school__district">tk-district</div>
                    </div>
                    <div class="school__percentage">-%</div>
                </div> <!-- school -->

                <div class="school" data-id="16">
                    <img src="" class="school__image">
                    <div class="school__details">
                        <div class="school__name">tk-name</div>
                        <div class="school__district">tk-district</div>
                    </div>
                    <div class="school__percentage">-%</div>
                </div> <!-- school -->

                <div class="school" data-id="17">
                    <img src="" class="school__image">
                    <div class="school__details">
                        <div class="school__name">tk-name</div>
                        <div class="school__district">tk-district</div>
                    </div>
                    <div class="school__percentage">-%</div>
                </div> <!-- school -->

                <div class="school" data-id="18">
                    <img src="" class="school__image">
                    <div class="school__details">
                        <div class="school__name">tk-name</div>
                        <div class="school__district">tk-district</div>
                    </div>
                    <div class="school__percentage">-%</div>
                </div> <!-- school -->

                <div class="school" data-id="19">
                    <img src="" class="school__image">
                    <div class="school__details">
                        <div class="school__name">tk-name</div>
                        <div class="school__district">tk-district</div>
                    </div>
                    <div class="school__percentage">-%</div>
                </div> <!-- school -->

                <div class="school" data-id="20">
                    <img src="" class="school__image">
                    <div class="school__details">
                        <div class="school__name">tk-name</div>
                        <div class="school__district">tk-district</div>
                    </div>
                    <div class="school__percentage">-%</div>
                </div> <!-- school -->
            </div><!-- schools -->
        </div>

【问题讨论】:

    标签: javascript jquery sorting jquery-isotope


    【解决方案1】:

    这应该可以为您解决问题。如果您有任何问题,请告诉我!

    var schools = [{
      "name": "School 1",
      "district": "Maplewood Richmond Heights",
      "crest": "src/img/crest-affton.jpg",
      "location": "",
      "percentEnglish": "1%",
      "percentMath": "21%",
      "percentScience": "41%",
      "percentSocial": "61%"
    }, {
      "name": "School 2",
      "district": "Maplewood Richmond Heights",
      "crest": "src/img/crest-affton.jpg",
      "location": "",
      "percentEnglish": "61%",
      "percentMath": "11%",
      "percentScience": "31%",
      "percentSocial": "81%"
    }, {
      "name": "School 3",
      "district": "Maplewood Richmond Heights",
      "crest": "src/img/crest-affton.jpg",
      "location": "",
      "percentEnglish": "13%",
      "percentMath": "28%",
      "percentScience": "49%",
      "percentSocial": "55%"
    }, ];
    
    function sortBySubject(schools, subject, descending) {
      descending = descending || false;
      if (!schools || !subject) {
        var orderedSchools = [];
        return orderedSchools;
      }
      var orderedSchools = schools.slice().sort(function(elem1, elem2) {
        var value1 = Number(elem1["percent" + subject].replace(/[^\d.]/g, "")),
          value2 = Number(elem2["percent" + subject].replace(/[^\d.]/g, ""));
        if (descending) {
          // descending
          return value1 === value2 ? 0 : +(value1 < value2) || -1;
        }
        // ascending
        return value1 === value2 ? 0 : +(value1 > value2) || -1;
      });
      return orderedSchools;
    }
    
    console.log(sortBySubject(schools, "English", true));

    编辑 - 添加 DOM 功能

    $(function() {
      var schools = [{
        "name": "School 1",
        "district": "Maplewood Richmond Heights",
        "crest": "src/img/crest-affton.jpg",
        "location": "",
        "percentEnglish": "1%",
        "percentMath": "21%",
        "percentScience": "41%",
        "percentSocial": "61%"
      }, {
        "name": "School 2",
        "district": "Maplewood Richmond Heights",
        "crest": "src/img/crest-affton.jpg",
        "location": "",
        "percentEnglish": "61%",
        "percentMath": "11%",
        "percentScience": "31%",
        "percentSocial": "81%"
      }, {
        "name": "School 3",
        "district": "Maplewood Richmond Heights",
        "crest": "src/img/crest-affton.jpg",
        "location": "",
        "percentEnglish": "13%",
        "percentMath": "28%",
        "percentScience": "49%",
        "percentSocial": "55%"
      }, ];
    
      function sortBySubject(schools, subject, descending) {
        descending = descending || false;
        if (!schools || !subject) {
          var orderedSchools = [];
          return orderedSchools;
        }
        var orderedSchools = schools.slice().sort(function(elem1, elem2) {
          var value1 = Number(elem1["percent" + subject].replace(/[^\d.]/g, "")),
            value2 = Number(elem2["percent" + subject].replace(/[^\d.]/g, ""));
          if (descending) {
            // descending
            return value1 === value2 ? 0 : +(value1 < value2) || -1;
          }
          // ascending
          return value1 === value2 ? 0 : +(value1 > value2) || -1;
        });
        return orderedSchools;
      }
    
      $(".widget__buttons button").on("click", function() {
        var subject = $(this).text();
        var orderedSchools = [];
        switch (subject) {
          case "Social Studies":
            {
              subject = "Social";
              break;
            }
        }
        orderedSchools = sortBySubject(schools, subject, true);
        $(".schools").empty();
        orderedSchools.forEach(function(elem, index) {
          var $school = $(".school.clone").clone(true);
          $school.removeClass("clone");
          $school.attr("data-id", (index + 1));
          $school.find(".school__image").attr("src", elem.crest);
          $school.find(".school__name").text(elem.name);
          $school.find(".school__district").text(elem.district);
          $school.find(".school__percentage").text(elem["percent" + subject]);
          $(".schools").append($school);
        });
      });
    });
    .clone {
      display: none;
    }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <div class="school clone" data-id="1">
      <img src="" class="school__image">
      <div class="school__details">
        <div class="school__name">tk-name</div>
        <div class="school__district">tk-district</div>
      </div>
      <div class="school__percentage">-%</div>
    </div>
    <!-- school -->
    <div class="widget__buttons">
      <p class="widget__rank">Rank by:</p>
      <button class="btn btn-english is-selected">English</button>
      <button class="btn btn-math">Math</button>
      <button class="btn btn-science">Science</button>
      <button class="btn btn-social">Social Studies</button>
    </div>
    <div class="wrapper">
      <div class="schools">
    
      </div>
      <!-- schools -->
    </div>

    【讨论】:

    • 您的函数运行良好,但我想知道如何合并它以更改 html,以便当我单击特定主题的 .btn 时,它将显示来自的 .school从高到低
    • @AndrewNguyen 你应该有一个单独的学校模板,你可以从那里克隆和创建你的 DOM 节点。这应该是简单的部分,但如果你想要我可以更新我的答案
    • 如果您能更新您的答案以便我能看到更大的图景,那就太好了
    • @AndrewNguyen 已更新。看看吧
    【解决方案2】:

    这应该可行:

    $(".btn").click(function(){                                                                              
          $(".btn").removeClass("is-selected");                                                                  
          $(this).addClass("is-selected");                                        
          var clazz = $(this).attr("class").split(" ")[1];                                                       
    
          var percent;                                                                                           
          switch(clazz) {                                                                                        
            case "btn-english" :                                                                                 
              percent = "percentEnglish";                                                                        
              break;                                                                                             
            case "btn-math" :                                                                                    
              percent = "percentMath";                                                                           
              break;                                                                                             
            case "btn-science" :                                                                                 
              percent = "percentScience"                                                                         
              break;                                                                                             
            case "btn-social" :                                                                                  
              percent = "percentSocial";                                                                          
              break;                                                                                             
    
          }                                                                                                      
          schools.sort(function(a, b) {                                                                          
            return a[percent] < b[percent];                                                                      
          });                                                                                                    
    
          $.each($(".school__percentage"), function(i, element) {                                                
            $(element).html(schools[i][percent]);                                                                
          });           
    

    【讨论】:

      猜你喜欢
      • 2020-08-10
      • 1970-01-01
      • 2020-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-13
      • 2021-07-16
      • 2012-04-05
      相关资源
      最近更新 更多