gpt4 book ai didi

javascript - 根据变量/条件重新排序 li 项

转载 作者:搜寻专家 更新时间:2023-10-31 22:01:56 25 4
gpt4 key购买 nike

我有一个列表如下:

<ul>
<li>First</li>
<li>Second</li>
<li>Third</li>
<li>Fourth</li>
<li>Fifth</li>
</ul>

我想要的是根据不同的条件对列表进行排序。例如,如果变量 state == "foo",我希望 Fourth li 首先出现,而 Second li 像这样出现在最后:

<ul>
<li>Fourth</li>
<li>First</li>
<li>Third</li>
<li>Fifth</li>
<li>Second</li>
</ul>

如果 state == "bar" 我希望列表以其他方式显示。

还要考虑到 future 可能存在 state 可能等于 "baz""foobar" 的情况,每个都有自己的顺序.因此,为每个状态编写自定义条件不是一种选择。

我的想法是为每个状态维护一个有序数组,然后根据数组使用 Mustache 或 Handlebars 之类的东西呈现列表。有没有更好的解决方案,这也是 future 的证明?

最佳答案

这是我将如何做到的:

  • 使用一个对象来存储不同的订单,
  • 使用 .forEach() 按照选定的顺序对 li 重新排序。

新片段

  • 使用 .map(),on 'change' function 可以减少到一行!

没有 jQuery(更轻!)

var original_list = document.querySelectorAll('#listToOrder li');
const orders = {
def: [0, 1, 2, 3, 4],
foo: [3, 0, 2, 4, 1],
bar: [3, 2, 4, 1, 0],
baz: [2, 4, 0, 3, 1]
}

document.querySelector('#selector').addEventListener('change', function() {
document.querySelector('#listToOrder').innerHTML = orders[this.value].map(index => original_list[index].outerHTML).join('');
});
<ul id="listToOrder">
<li>First</li>
<li>Second</li>
<li>Third</li>
<li>Fourth</li>
<li>Fifth</li>
</ul>
<label>Select order: </label>
<select id="selector">
<option value="def">Default</option>
<option value="foo">Foo</option>
<option value="bar">Bar</option>
<option value="baz">Baz</option>
</select>

使用 jQuery

var original_list = $('#listToOrder li');
const orders = {
def: [0, 1, 2, 3, 4],
foo: [3, 0, 2, 4, 1],
bar: [3, 2, 4, 1, 0],
baz: [2, 4, 0, 3, 1]
}

$('#selector').on('change', function() {
$('#listToOrder').html(orders[this.value].map(index => original_list[index].outerHTML));
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<ul id="listToOrder">
<li>First</li>
<li>Second</li>
<li>Third</li>
<li>Fourth</li>
<li>Fifth</li>
</ul>
<label>Select order: </label>
<select id="selector">
<option value="def">Default</option>
<option value="foo">Foo</option>
<option value="bar">Bar</option>
<option value="baz">Baz</option>
</select>


旧片段

我想不出更简单的方法……但是 .map() 是个好点!

var original_list = $('#listToOrder li');
const orders = {
def: [0, 1, 2, 3, 4],
foo: [3, 0, 2, 4, 1],
bar: [3, 2, 4, 1, 0],
baz: [2, 4, 0, 3, 1]
}

$('#selector').on('change', function() {
var lis = '';
orders[this.value].forEach(function(i){
lis += original_list[i].outerHTML;
})
$('#listToOrder').html(lis);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<ul id="listToOrder">
<li>First</li>
<li>Second</li>
<li>Third</li>
<li>Fourth</li>
<li>Fifth</li>
</ul>
<label>Select order: </label>
<select id="selector">
<option value="def">Default</option>
<option value="foo">Foo</option>
<option value="bar">Bar</option>
<option value="baz">Baz</option>
</select>

关于javascript - 根据变量/条件重新排序 li 项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51890476/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com