首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >用于过滤三个不同列表的Javascript函数

用于过滤三个不同列表的Javascript函数
EN

Stack Overflow用户
提问于 2020-12-09 19:30:40
回答 2查看 78关注 0票数 1

我对javascript完全是个新手,所以请原谅我的无礼。

我希望根据文本框中键入的内容过滤三个不同的列表。我的函数只对第一个列表进行排序,而且只在"get element by Id“而不是class的时候。

我的想法是按类获取元素,从而过滤所有三个列表,但它并不是以这种方式工作的。我能做什么?

Javascript:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 <script>
    function filterList() {
        
        var input, filter, ul, li, a, i, txtValue;
        input = document.getElementById('searchCombo');
        filter = input.value.toUpperCase();
        ul = document.getElementsByClassName("drugList");
        li = ul.getElementsByTagName('li');

        
        for (i = 0; i < li.length; i++) {
            a = li[i].getElementsByTagName("a")[0];
            txtValue = a.textContent || a.innerText;
            if (txtValue.toUpperCase().indexOf(filter) > -1) {
                li[i].style.display = "";
            } else {
                li[i].style.display = "none";
            }
        }
    }
</script>

HTML列表:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<input type="text" id="searchCombo" onkeyup="filterList()" placeholder="Search for names..">

<ul ID="list1" class="drugList">
    <li><a href="#">List 1 element 1</a></li>
    <li><a href="#">List 1 element 2</a></li>
    <li><a href="#">List 1 element 3</a></li>
</ul>

<ul ID="list2" class="drugList">
    <li><a href="#">List 2 element 1</a></li>
    <li><a href="#">List 2 element 2</a></li>
    <li><a href="#">List 2 element 3</a></li>
</ul>

<ul ID="list3" class="drugList">
    <li><a href="#">List 3 element 1</a></li>
    <li><a href="#">List 3 element 2</a></li>
    <li><a href="#">List 3 element 3</a></li>
</ul>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-12-09 19:44:42

我建议您使用Element.querySelectorAll()来过滤drugList类中的li元素。然后遍历元素:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const nothingFound = document.querySelector('.nothingFound');
nothingFound.style.display="none";
const searchCombo = document.getElementById('searchCombo');
searchCombo.addEventListener("keyup", (e)=> {
  const {value} = e.target;
  const liElements=Array.from(document.querySelectorAll(".drugList li"));
  let count = 0;
  liElements.forEach(li => {
    li.style.display = "none"
    if(li.textContent.toLowerCase().includes(value.toLowerCase())) {
      li.style.display = "";
      ++count;
    }
  });

  nothingFound.style.display = count > 0 ? "none": "";
});
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    <input type="text" id="searchCombo" placeholder="Search for names..">

    <ul ID="list1" class="drugList">
        <li><a href="#">List 1 element 1</a></li>
        <li><a href="#">List 1 element 2</a></li>
        <li><a href="#">List 1 element 3</a></li>
    </ul>

    <ul ID="list2" class="drugList">
        <li><a href="#">List 2 element 1</a></li>
        <li><a href="#">List 2 element 2</a></li>
        <li><a href="#">List 2 element 3</a></li>
    </ul>

    <ul ID="list3" class="drugList">
        <li><a href="#">List 3 element 1</a></li>
        <li><a href="#">List 3 element 2</a></li>
        <li><a href="#">List 3 element 3</a></li>
    </ul>
  <span class="nothingFound">Nothing found in this category</span>

另外,你应该考虑使用css类而不是element.style.display。

票数 1
EN

Stack Overflow用户

发布于 2020-12-09 22:22:43

我不确定这个答案是否有那么大的价值,它借鉴了@lissettdm的答案,我写它主要是为了看看我会写什么。我把它贴在这里,以防有人感兴趣。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const select_all = (selector, selectee = document) =>
  Array.from(selectee.querySelectorAll(selector));

const hide_item = item => item.style.display = 'none';
const show_item = item => item.style.display = '';
const item_text = item => item.textContent.toLowerCase() + ' ' + item.dataset.keywords;
const compare   = text => item => item_text(item).includes(text);
const has_class = class_name => item => item.className.includes(class_name);
const not_has_class = class_name => item => !has_class(class_name)(item);
const both = (pred_a, pred_b) => item => pred_a(item) && pred_b(item);

const filter_list = text => list => {
  const lis = select_all("li", list);
  
  let to_show = lis.filter(both( not_has_class('none'), compare(text) ));
  if(to_show.length === 0)
    to_show = lis.filter(has_class('none'));
  
  lis.forEach(hide_item);
  to_show.forEach(show_item);
};

const filter = (event) =>
  select_all(".drugList").forEach(
    filter_list((event?.target?.value || '').toLowerCase())
  );

document.getElementById('searchCombo').addEventListener("keyup", filter);

filter();
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<input type="text" id="searchCombo" placeholder="Search for names..">

<ul ID="list1" class="drugList">
    <li data-keywords="additional keywords"><a href="#">List 1 element 1</a></li>
    <li data-keywords="bob fred"><a href="#">List 1 element 2</a></li>
    <li data-keywords="jane neela"><a href="#">List 1 element 3</a></li>
    <li class="none">Nothing found in this category</li>
</ul>

<ul ID="list2" class="drugList">
    <li><a href="#">List 2 element 1</a></li>
    <li><a href="#">List 2 element 2</a></li>
    <li><a href="#">List 2 element 3</a></li>
    <li class="none">Nothing found in this category</li>
</ul>

<ul ID="list3" class="drugList">
    <li><a href="#">List 3 element 1</a></li>
    <li><a href="#">List 3 element 2</a></li>
    <li><a href="#">List 3 element 3</a></li>
    <li class="none">Nothing found in this category</li>
</ul>

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65223644

复制
相关文章
JavaScript删除列表中指定元素,过滤指定元素
作为工具人的我,昨晚有人问我用js怎么删除一个列表中等于0的元素 一开始我想的是用循环,后来百度发现有个东西叫做filter <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>删除0</title> </head> <body> <div
SingYi
2022/07/14
1.6K0
JavaScript删除列表中指定元素,过滤指定元素
JavaScript 函数定义的几种不同方式
在这篇中我们主要将函数的概念和函数声明的几种方式,牵扯到的还有函数中的形参和实参传参的问题,除此之外我们还会说一说 最常用 return 的作用,以及函数中处理参数的 arguments 等。
程序狗
2021/12/07
7680
JavaScript 函数定义的几种不同方式
JavaScript之函数(二) 函数内部三个不常见的属性
arguments就不多说了,但是arguments有一个callee属性,是一个指向arguments对象所在函数的指针。
赤蓝紫
2023/03/11
5480
vue列表过滤
一种常见的列表过滤方式是使用计算属性。计算属性是Vue.js提供的一种便捷的属性,它根据已有的数据计算出一个新的属性,并将结果缓存起来,只在相关依赖发生改变时才重新计算。通过使用计算属性,可以根据特定的条件过滤列表数据。
堕落飞鸟
2023/05/21
5910
python 列表过滤
-------or values = ['1', '2', '-3', '-', '4', 'N/A', '5'] def is_int(val): try: x = int(val) return True except ValueError: return False ivals = list(filter(is_int, values)) print(ivals)
用户5760343
2019/09/25
9440
python列表过滤的方法
在python中,对列表这样的数据结构进行过滤,提取自己需要的元素,组成新的列表,是很常见的操作,这就要自然而然的用到列表过滤了,而常用的过滤当然就是循环后通过if进行,但是这样子,显然就是代码的开支有些大。
py3study
2020/01/13
1.7K0
lodash源码阅读-----用于过滤的方法pull
lodash还有一个pullAll方法,用法几乎都是一样的,不同的只是它接收两个参数,第一个是目标数组,第二参数也是一个需要除去元素构成的数组。
Jou
2022/08/10
6230
JavaScript中的过滤器(filter)
filter()方法会创建一个新数组,原数组的每个元素传入回调函数中,回调函数中有return返回值,若返回值为true,这个元素保存到新数组中;若返回值为false,则该元素不保存到新数组中;原数组不发生改变。
刘亦枫
2020/03/19
3.4K0
Python:过滤序列的filter()函数
文章背景: 最近在学习廖雪峰老师的Python文章,其中有个章节讲到的是filter()函数,该函数用于过滤序列。在学习过程中,也顺带巩固了其它的知识点,在此进行相应的整理。
Exploring
2022/09/20
9590
python中的过滤函数 filter()
new_list = list(filter(is_odd, [1, 2, 3, 4, 5, 6, 7, 8]))
用户7886150
2021/01/24
9520
用于查找子列表总和的 Python 程序
以下程序返回子列表的总和,即使用 for 循环返回给定开始和结束索引的元素总和 −
很酷的站长
2023/02/23
1.8K0
用于查找子列表总和的 Python 程序
Python 列表的copy函数
列表的copy函数 功能 将当前列表复制一份相同的列表,新列表与旧列表内容相同,但内存空间不同 用法 list.copy() -> 该函数无参数 , 返回一个一模一样的列表 copy与二次赋值的区别 二次赋值的变量与原始变量享有相同内存空间 copy函数创建的新列表与原始列表不是一个内存空间,不同享数据变更 copy 属于 浅拷贝 a = [1,2,3] b = a a = [1,2,3] b = a.copy() b.append(4) b -> [1,2,3,4] a -> [1,2,3] 浅
Zkeq
2022/05/18
1K0
Python 列表的copy函数
PHP常见函数和过滤函数的深入探究
32 位系统最大带符号的 integer 范围是 -2147483648 到 2147483647。举例,在这样的系统上, intval(‘1000000000000’) 会返回 2147483647。64 位系统上,最大带符号的 integer 值是 9223372036854775807。
V站CEO-西顾
2018/06/25
2.9K3
Python 列表的reverse函数
列表的reverse函数 功能 对当前的列表顺序进行反转 用法 list.reverse() 参数 无参数传递 代码 # coding:utf-8 students = [ {'name': 'dewei', 'age': 33, 'top': 174}, {'name': '小慕', 'age': 10, 'top': 175}, {'name': '小高', 'age': 18, 'top': 188}, {'name': 'Xiaoyun', 'age': 18, '
Zkeq
2022/05/18
5920
Python 列表的remove函数
列表的remove函数 功能 删除列表中的某个元素 用法 list.remove(item) 参数 item : 准备删除的函数 注意事项 如果删除的成员(元素)不存在 , 会直接报错 如果被删除的元素有多个 , 只会删除第一个(从左往右数) remove函数**不会返回一个新的列表,**而是在原先的列表中对元素进行删除(列表是可以被修改的) Python内置函数 del del把变量完全删除 代码 # coding:utf-8 shops = ['可乐', '洗发水', '可乐', '牛奶', '牛奶'
Zkeq
2022/05/18
6770
Python 列表的clear函数
列表的clear函数 功能 将当前列表中的数据清空 用法 list.clear() -> 该函数无参数 , 无返回值 注意 比空列表节省性能 代码 # coding:utf-8 mix = ['python', 1, (1,), {'name': 'dewei'}] print(mix, len(mix)) mix.clear() print(mix, len(mix)) mixs = []
Zkeq
2022/05/18
8690
Python 列表的extend函数
列表的extend函数 功能 将其他列表或元组中的元素导入当前列表中 用法 list.extend(iterable) 参数 iterable代表列表或元组 , 该函数无返回值 注意事项 传入的必须是iterable 直接传入字符串的话会被拆分成很多个单个字符 不可传入整形或者布尔类型之类的(不是iterable就不行) 传入字典的话只会保留key的值 代码 # coding:utf-8 manhua = [] history = [] code = [] new_manhua = ('a', 'b',
Zkeq
2022/05/18
7470
用于列表下拉加载loading动画
一、效果图 弹跳加载 二、实现代码 <view class="bouncing-loader"> <view></view> <view></view> <view></view> </v
_kyle
2020/08/24
3.6K0
用于列表下拉加载loading动画
python 列表函数
注意:(1)list1[beg:end]将显示列表的从list1[beg]到list1[end-1]的元素,list1[end]不会显示
全栈程序员站长
2022/09/08
5420
python 列表函数
点击加载更多

相似问题

用于创建第三个列表的2个不同长度的列表

30

用于将值追加到三个列表的小函数

20

用于过滤输入列表的Scala多态函数

20

Javascript函数,用于查找数字列表的模式

20

JavaScript -创建用于编辑列表项的函数

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文