【问题标题】:How to sort select alphabetically which contains optgroup?如何按字母顺序对包含 optgroup 的选择进行排序?
【发布时间】:2020-05-27 13:43:37
【问题描述】:

我有以下 Bootstrap SelectPicker。我想按字母顺序对所有optionoptgroup 进行排序。我的代码似乎不适用于 SelectPicker,也不适用于普通的 select。有人知道怎么做吗?

var options = $('select option');
var arr = options.map(function(_, o) { return { t: $(o).text(), v: o.value }; }).get();
arr.sort(function(o1, o2) { return o1.t > o2.t ? 1 : o1.t < o2.t ? -1 : 0; });
options.each(function(i, o) {
  o.value = arr[i].v;
  $(o).text(arr[i].t);
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<select id="property-area" name="property_area" class="selectpicker" data-style="btn btn-primary btn-round" data-live-search="true" tabindex="-98">
  <option value="1208">Amalfi Coast</option>
  <option value="1224">Apulia</option>
  <optgroup data-id="1221" label="Tuscany">
    <option value="1302" data-parent-id="1221">Arezzo</option>
    <option value="1299" data-parent-id="1221">Argentario</option>
    <option value="1270" data-parent-id="1221">Chianti</option>
    <option value="1261" data-parent-id="1221">Florence</option>
    <option value="1297" data-parent-id="1221">Lucca &amp; Pisa</option>
    <option value="1290" data-parent-id="1221">Maremma</option>
    <option value="1283" data-parent-id="1221">Siena</option>
    <option value="1330" data-parent-id="1221">Val D'Orcia</option>
  </optgroup>
  <option value="1213">Capri Island</option>
  <option value="1249">Cilento Coast</option>
  <option value="1215">Como Lake</option>
  <option value="1253">Garda Lake</option>
  <option value="1334">Ischia Island</option>
  <option value="1257">Maggiore Lake</option>
  <option value="1234">Rome City</option>
  <option value="1308">Sicily</option>
  <option value="1205">Sorrento Coast</option>
  <option value="1218">Umbria</option>
</select>

【问题讨论】:

  • 你是如何将这种排序应用到options 的?
  • @freedomn-m 我更新了sn-p
  • 我已将 jquery 添加到 sn-p 以便它运行并冒昧删除 .whatever 选择器以便它找到您的 select(或者可以添加 class='whatever' -现在应用了排序。您能否提供有关它如何不执行您想要的操作的详细信息(您的预期输出与它执行的操作)。例如,如果您希望将 optgroup 中的项目排除在主排序之外
  • @freedomn-m 我明白了,谢谢,基本上返回的结果是错误的,因为Tuscany 应该放在Sorrento 之后
  • "optgroup is skipped" - 因为您的选择器使用select option 并且optgroup 不是option。您不能使用相同的排序,因为您正在更改值+文本而不是对 DOM 节点进行排序。

标签: javascript jquery bootstrap-selectpicker


【解决方案1】:

你可以像这样使用 vanilla JS 来做到这一点。我将一些最后的项目放在下拉列表中作为第一个项目,只是为了演示。

如果你给他们所有标签,那么你可以这样做:

function sortStuff(arr) {
  arr.sort((a, b) => {
    if (a.label < b.label) {
      return -1;
    } else if (a.label > b.label) {
      return 1
    }
    return 0;
  })
  return arr
}

var select = document.querySelector('select')
var options = [...select.children]
var sortedOptions = sortStuff(options)

select.innerHTML = ''
sortedOptions.forEach(i => select.append(i))
sortedOptions[0].setAttribute('selected', 'true')
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<select id="property-area" name="property_area" class="selectpicker" data-style="btn btn-primary btn-round" data-live-search="true" tabindex="-98">
  <option value="1218" label="Umbria">Umbria</option>
  <option value="1205" label="Sorrento Coast">Sorrento Coast</option>
  <option value="1208" label="Amalfi Coast">Amalfi Coast</option>
  <option value="1224" label="Apulia">Apulia</option>
  <optgroup data-id="1221" label="Tuscany">
    <option value="1302" data-parent-id="1221">Arezzo</option>
    <option value="1299" data-parent-id="1221">Argentario</option>
    <option value="1270" data-parent-id="1221">Chianti</option>
    <option value="1261" data-parent-id="1221">Florence</option>
    <option value="1297" data-parent-id="1221">Lucca &amp; Pisa</option>
    <option value="1290" data-parent-id="1221">Maremma</option>
    <option value="1283" data-parent-id="1221">Siena</option>
    <option value="1330" data-parent-id="1221">Val D'Orcia</option>
  </optgroup>
  <option value="1213" label="Capri Island">Capri Island</option>
  <option value="1249" label="Cilento Coast">Cilento Coast</option>
  <option value="1215" label="Como Lake">Como Lake</option>
  <option value="1253" label="Garda Lake">Garda Lake</option>
  <option value="1334" label="Ischia Island">Ischia Island</option>
  <option value="1257" label="Maggiore Lake">Maggiore Lake</option>
  <option value="1234" label="Rome City">Rome City</option>
  <option value="1308" label="Sicily">Sicily</option>
</select>

【讨论】:

  • 感谢您的回答,但结果不正确,从 sn-p 可以看出不是按字母顺序排列
  • 当然是@sfarzoso。我也意识到了这一点,所以我更新了答案,现在它将托斯卡纳放在正确的位置。试试看 =) 你只需要给他们所有标签
  • 耶博是的,我做到了。也许只是刷新一下??我认为托斯卡纳是倒数第二——就在翁布里亚之前
  • 检查一下:imgur.com/a/rvR9e4h 你能在外面做一个小提琴吗?
  • 好的@sfarzoso,对所有的来回感到抱歉。它现在在下拉列表中重新排列它们,所以它应该可以完美地工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-28
  • 1970-01-01
  • 2011-01-04
  • 2011-08-29
  • 2010-11-23
相关资源
最近更新 更多