jQuery 按属性对不同的 class 元素进行排序

jQuery sort different class elements by attribute

有两个数组显示将元素附加到文档的信息。它们按升序打印,但在组织它们时,我无法按数据属性单独组织它们。

此函数进行排序但不能混合不同的元素类:

        $.fn.sortRaffles = function () {
          this
            .children()
            .sort((a, b) => $(a).data("order") - $(b).data("order") || -1)
            .appendTo(this);

          return this;
        }
        $(".lista ul").sortRaffles();

在上面的代码之前,这是我使用字符串数组打印两个不同元素 类(avaibleRaffle 和 reservedRaffle)并过滤它们以显示正确结果的地方。

const nums = Array.from({ length: 11 }, (_, i) => `${i}`.padStart(3, "0"));

const customers = [
  { number: "002" },
  { number: "6003" },
  { number: "1010" },
  { number: "008,005,007,0002" }
];

const reserved_nums = nums.filter(
  (s) => !customers.some((o) => o.number.includes(s))
);

const avaible_nums = nums.filter((s) =>
  customers.some((o) => o.number.includes(s))
);

var avaibleRaffle = $();
$.each(avaible_nums, function (index, value) {
  avaibleRaffle = avaibleRaffle.add(
    '<span class="btn btn-success btn_reservas data-order="' +
      value +
      '" >' +
      value +
      "</span>"
  );
});
$(".lista ul li").append(avaibleRaffle);

var reservedRaffle = $();
$.each(reserved_nums, function (index, value) {
  reservedRaffle = reservedRaffle.add(
    '<span class="btn btn-warning btn_pagos data-order="' +
      value +
      '" >' +
      value +
      "</span>"
  );
});
$(".lista ul li").append(reservedRaffle);

最小的可重现示例:

/* eslint-env jquery */

const nums = Array.from({ length: 11 }, (_, i) => `${i}`.padStart(3, "0"));

const customers = [
  { number: "002" },
  { number: "6003" },
  { number: "1010" },
  { number: "008,005,007,0002" }
];

const reserved_nums = nums.filter(
  (s) => !customers.some((o) => o.number.includes(s))
);

const avaible_nums = nums.filter((s) =>
  customers.some((o) => o.number.includes(s))
);

var avaibleRaffle = $();
$.each(avaible_nums, function (index, value) {
  avaibleRaffle = avaibleRaffle.add(
    '<span class="btn btn-success btn_reservas data-order="' +
      value +
      '" >' +
      value +
      "</span>"
  );
});
$(".lista ul li").append(avaibleRaffle);

var reservedRaffle = $();
$.each(reserved_nums, function (index, value) {
  reservedRaffle = reservedRaffle.add(
    '<span class="btn btn-warning btn_pagos data-order="' +
      value +
      '" >' +
      value +
      "</span>"
  );
});
$(".lista ul li").append(reservedRaffle);

$.fn.sortRaffles = function () {
  this.children()
    .sort((a, b) => $(a).data("order") - $(b).data("order") || -1)
    .appendTo(this);

  return this;
};
$(".lista ul li span").sortRaffles();

console.log("Desired Order:", JSON.stringify(nums));
console.log("Avaible:", JSON.stringify(avaible_nums));
console.log("Reserved:", JSON.stringify(reserved_nums));
.lista ul li {
  display: inline;
}

.lista ul li span {
  border-radius: 50%;
  width: 100%;
  max-width: 40px;
  height: auto;
  margin: 3px;
  padding: 6px;
}
<html>
  <head>
    <title>Parcel Sandbox</title>
    <meta charset="UTF-8" />
    <link
      type="text/css"
      rel="stylesheet"
      href="https://cdnjs.cloudflare.com/ajax/libs/semantic-ui/2.3.1/semantic.css"
    />
    <link
      rel="stylesheet"
      href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.0/dist/css/bootstrap.min.css"
      integrity="sha384-B0vP5xmATw1+K9KRQjQERJvTumQW0nPEzvF6L/Z6nronJ3oUOFUFpCjEUQouq2+l"
      crossorigin="anonymous"
    />

    <link type="text/css" rel="stylesheet" href="src/styles.css" />
  </head>

  <body>
    <div class="lista">
      <ul>
        <li>
          <span></span>
        </li>
      </ul>
    </div>

    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
    <script src="src/index.js"></script>
  </body>
</html>

要使代码正常工作,您应该做两件事。 1- 修复 html。您在这两行中都错过了 "

'<span class="btn btn-success btn_reservas**"** data-order="' +

没有它,浏览器无法读取 data-order 属性。

2- 您的排序功能看起来几乎没问题,但要使其正常工作,请执行以下操作:

$.fn.sortRaffles = function () {
    var ordered = $(this).sort(function(a,b){
        return parseInt(a.dataset.order,10) > parseInt(b.dataset.order, 10);
    });
    $(".lista ul li").html(ordered);
    return this;
};

因为我无法解决在使用排序验证后按升序打印数字的问题。除了协作之外,我还提出了一个仅使用 forEach 进行数组比较的解决方案:

                nums.forEach(function (value) {
                    if (avaibleNumbers.indexOf(value) != -1) {
                        var av = avaibleNumbers.indexOf(value);
                        console.log(avaibleNumbers[av]);
                    }
                    else if (reservedNumbers.indexOf(value) != -1) {
                        var rs = reservedNumbers.indexOf(value);
                        console.log(reservedNumbers[rs]);
                    }
                });