代码之家  ›  专栏  ›  技术社区  ›  Borja

如何仅使用Jquery对div列表进行排序?

  •  0
  • Borja  · 技术社区  · 7 年前

    我有一个包含很多元素的div列表,我想做很多排序:

                <div id="lista-terremoti" style="">
                  <div class="eq-lista">
                    <div class="mark-eq-lista"><span style="display:none">1536017841000</span></div>
                    <div class="dati-eq">
                      <div class="eq-lista-row" style="">
                        <div class="eq-lista-data" style="">2018-09-03&nbsp;&nbsp;23:37:21 UTC</div>
                        <div class="eq-lista-luogo">Al largo dell'Ecuador</div>
                        <div id="magn-ipo-link">
                          <div class="eq-lista-magn">4.9 M</div>
                          <div class="eq-lista-ipo">40 Km</div>
                          <div class="eq-lista-link"><a href="#" rel="nofollow">Dettagli</a></div>
                        </div>
                      </div>
                      <div class="ulteriore" style="display:none"></div>
                    </div>
                  </div>
                  <div class="eq-lista">
                    <div class="mark-eq-lista"><span style="display:none">1536017747000</span></div>
                    <div class="dati-eq">
                      <div class="eq-lista-row" style="">
                        <div class="eq-lista-data" style="">2018-09-03&nbsp;&nbsp;23:35:47 UTC</div>
                        <div class="eq-lista-luogo">Isole Marianne</div>
                        <div id="magn-ipo-link">
                          <div class="eq-lista-magn">5 M</div>
                          <div class="eq-lista-ipo">200 Km</div>
                          <div class="eq-lista-link"><a href="#" rel="nofollow">Dettagli</a></div>
                        </div>
                      </div>
                      <div class="ulteriore" style="display:none"></div>
                    </div>
                  </div>
                  <div class="eq-lista">
                    <div class="mark-eq-lista"><span style="display:none">1536015211000</span></div>
                    <div class="dati-eq">
                      <div class="eq-lista-row" style="">
                        <div class="eq-lista-data" style="">2018-09-03&nbsp;&nbsp;22:53:31 UTC</div>
                        <div class="eq-lista-luogo">California centrale, Stati Uniti</div>
                        <div id="magn-ipo-link">
                          <div class="eq-lista-magn">2.5 M</div>
                          <div class="eq-lista-ipo">15 Km</div>
                          <div class="eq-lista-link"><a href="#" rel="nofollow">Dettagli</a></div>
                        </div>
                      </div>
                      <div class="ulteriore" style="display:none"></div>
                    </div>
                  </div>
                  <div class="eq-lista">
                    <div class="mark-eq-lista"><span style="display:none">1536015088000</span></div>
                    <div class="dati-eq">
                      <div class="eq-lista-row" style="">
                        <div class="eq-lista-data" style="">2018-09-03&nbsp;&nbsp;22:51:28 UTC</div>
                        <div class="eq-lista-luogo">Alaska meridionale</div>
                        <div id="magn-ipo-link">
                          <div class="eq-lista-magn">2.1 M</div>
                          <div class="eq-lista-ipo">74.6 Km</div>
                          <div class="eq-lista-link"><a href="#" rel="nofollow">Dettagli</a></div>
                        </div>
                      </div>
                      <div class="ulteriore" style="display:none"></div>
                    </div>
                  </div>
                </div>
    

    每个分区 .eq-lista UTC日期 (地震的时间戳在里面 .mark-eq-lista > span ), , 震级 深度

    我想用两种方式对列表排序:

    2) 从最高的震级到最低的震级排序( .eq-lista-magn )

    var items = $('#lista-terremoti > .eq-lista').get();
    items.sort(function(a, b) {
      var keyA = $(a).children(':first').children();
      var keyB = $(a).children(':first').children();
    
      if (keyA < keyB) return -1;
      if (keyA > keyB) return 1;
      return 0;
    });
    var div_list = $('#lista-terremoti');
    $.each(items, function(i, quake) {
      div_list.append(quake); /* This removes li from the old spot and moves it */
    });
    

    我希望你能帮我…非常感谢!

    1 回复  |  直到 7 年前
        1
  •  2
  •   CertainPerformance    7 年前

    我会把时间戳的获取和数量级的获取抽象成不同的函数,以保持代码的干性。然后,你可以按

    items.sort((a, b) => (
      eqToTimestamp(a) - eqToTimestamp(b)
      || eqToMagn(a) - eqToMagn(b)
    ));
    

    请注意,时间戳比较将 得出的结果不是0,在这种情况下,数量级的差异很少会对列表顺序产生影响。

    const eqToTimestamp = eq => Number(eq.children[0].textContent);
    const eqToMagn = eq => (
      Number(eq.querySelector('.eq-lista-magn').textContent.match(/\S+/))
    );
    const items = $('#lista-terremoti > .eq-lista').get();
    items.sort((a, b) => (
      eqToTimestamp(a) - eqToTimestamp(b)
      || eqToMagn(b) - eqToMagn(a)
    ));
    
    const div_list = $('#lista-terremoti');
    items.forEach(item => div_list.append(item));
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <div id="lista-terremoti" style="">
      <div class="eq-lista">
        <div class="mark-eq-lista"><span style="display:none">1536017841000</span></div>
        <div class="dati-eq">
          <div class="eq-lista-row" style="">
            <div class="eq-lista-data" style="">2018-09-03&nbsp;&nbsp;23:37:21 UTC</div>
            <div class="eq-lista-luogo">Al largo dell'Ecuador</div>
            <div id="magn-ipo-link">
              <div class="eq-lista-magn">4.9 M</div>
              <div class="eq-lista-ipo">40 Km</div>
              <div class="eq-lista-link"><a href="#" rel="nofollow">Dettagli</a></div>
            </div>
          </div>
          <div class="ulteriore" style="display:none"></div>
        </div>
      </div>
      <div class="eq-lista">
        <div class="mark-eq-lista"><span style="display:none">1536017747000</span></div>
        <div class="dati-eq">
          <div class="eq-lista-row" style="">
            <div class="eq-lista-data" style="">2018-09-03&nbsp;&nbsp;23:35:47 UTC</div>
            <div class="eq-lista-luogo">Isole Marianne</div>
            <div id="magn-ipo-link">
              <div class="eq-lista-magn">5 M</div>
              <div class="eq-lista-ipo">200 Km</div>
              <div class="eq-lista-link"><a href="#" rel="nofollow">Dettagli</a></div>
            </div>
          </div>
          <div class="ulteriore" style="display:none"></div>
        </div>
      </div>
      <div class="eq-lista">
        <div class="mark-eq-lista"><span style="display:none">1536015211000</span></div>
        <div class="dati-eq">
          <div class="eq-lista-row" style="">
            <div class="eq-lista-data" style="">2018-09-03&nbsp;&nbsp;22:53:31 UTC</div>
            <div class="eq-lista-luogo">California centrale, Stati Uniti</div>
            <div id="magn-ipo-link">
              <div class="eq-lista-magn">2.5 M</div>
              <div class="eq-lista-ipo">15 Km</div>
              <div class="eq-lista-link"><a href="#" rel="nofollow">Dettagli</a></div>
            </div>
          </div>
          <div class="ulteriore" style="display:none"></div>
        </div>
      </div>
      <div class="eq-lista">
        <div class="mark-eq-lista"><span style="display:none">1536015088000</span></div>
        <div class="dati-eq">
          <div class="eq-lista-row" style="">
            <div class="eq-lista-data" style="">2018-09-03&nbsp;&nbsp;22:51:28 UTC</div>
            <div class="eq-lista-luogo">Alaska meridionale</div>
            <div id="magn-ipo-link">
              <div class="eq-lista-magn">2.1 M</div>
              <div class="eq-lista-ipo">74.6 Km</div>
              <div class="eq-lista-link"><a href="#" rel="nofollow">Dettagli</a></div>
            </div>
          </div>
          <div class="ulteriore" style="display:none"></div>
        </div>
      </div>
    </div>

    要仅按大小排序,请使用 items.sort((a, b) => eqToMagn(a) - eqToMagn(b));

    const eqToTimestamp = eq => Number(eq.children[0].textContent);
    const eqToMagn = eq => (
      Number(eq.querySelector('.eq-lista-magn').textContent.match(/\S+/))
    );
    const items = $('#lista-terremoti > .eq-lista').get();
    items.sort((a, b) => eqToMagn(b) - eqToMagn(a));
    
    const div_list = $('#lista-terremoti');
    items.forEach(item => div_list.append(item));
    <<div class=“eq lista”>
    <div class=“mark eq lista”><span style=”显示:无“>1536017841000</span></div>
    <div class=“dati eq”>
    <div class=“eq lista row”style=“”>
    <div class=“eq lista luogo”>厄瓜多尔拉尔戈</div>
    <div class=“eq lista magn”>4.9米</div>
    <div class=“eq lista link”><a href=“#”rel=“nofollow”>Dettagli</a></div>
    </div>
    <div class=“ulteriore”样式=“显示:无“></div>
    </div>
    <div class=“eq lista”>
    <div class=“mark eq lista”><span style=”显示:无“>1536017747000</span></div>
    <div class=“dati eq”>
    <div class=“eq lista luogo”>伊索尔玛丽安</div>
    <div class=“eq lista ipo”>200公里</div>
    <div class=“eq lista link”><a href=“#”rel=“nofollow”>Dettagli</a></div>
    </div>
    </div>
    <div class=“ulteriore”样式=“显示:无“></div>
    </div>
    <div class=“eq lista”>
    <div class=“dati eq”>
    <div class=“eq lista row”style=“”>
    <div class=“eq lista luogo”>加州中央车站</div>
    <div id=“magn ipo link”>
    <div class=“eq lista magn”>2.5米</div>
    </div>
    </div>
    <div class=“ulteriore”样式=“显示:无“></div>
    <div class=“eq lista”>
    <div class=“dati eq”>
    <div class=“eq lista luogo”>阿拉斯加梅里迪奥纳勒</div>
    <div id=“magn ipo link”>
    <div class=“eq lista ipo”>74.6公里</div>
    </div>
    <div class=“ulteriore”样式=“显示:无“></div>
    </div>
    </div>