我的编程空间,编程开发者的网络收藏夹
学习永远不晚

JS怎么实现数组过滤从简单到多条件筛选

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

JS怎么实现数组过滤从简单到多条件筛选

本篇内容主要讲解“JS怎么实现数组过滤从简单到多条件筛选”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JS怎么实现数组过滤从简单到多条件筛选”吧!

目录
  • 单条件单数据筛选

  • 单条件多数据筛选

  • 多条件单数据筛选

  • 多条件多数据筛选

  • 知识点1: Object.key() 获取数组索引或者对象属性

  • 知识点2: js里的falsy

  • 知识点3: Array.every 与 Array.some的区别

  • 知识点4: 数组的深拷贝与浅拷贝

  • 想一想:递归算法的优化

在上家公司工作的时候,有一个需求是在前端部分完成筛选功能,一次拿到所有数据,然后根据条件筛选。通常情况下筛选是后台给接口,在数据量不大的情况下,也有人可能会遇到前端筛选这样的情况,特别写了这篇文章分享给大家,有问题请指出,互相学习。

一般情况下的单条件筛选,数组的filter方法就能够满足需求,本文讨论的重点是多条件下的复合筛选,并列出了几个相关知识点。

以下是很多个????

// 这个是例子中的被筛选数组var aim = [    {name:'Anne', age: 23, gender:'female'},    {name:'Leila', age: 16, gender:'female'},    {name:'Jay', age: 19, gender:'male'},    {name:'Mark', age: 40, gender:'male'}]

单条件单数据筛选

根据单个名字筛选,用filter方法,判断name是否为目标名字即可

// 根据单个名字筛选function filterByName(aim, name) {    return aim.filter(item => item.name == name)}// 输入 aim 'Leila' 期望输出为 [{name:'Leila', age: 16, gender:'female'}]console.log(filterByName(aim,'leila'))

单条件多数据筛选

根据多个名字筛选,这里是用for循环遍历目标数组,然后用find方法找到后push到结果数组里,用find方法是重名情况下也能得到想要的结果。for循环可以用数组的一些遍历方法替代,代码可以更简化,示例就是大概表达个意思。

// 根据多个名字筛选function filterByName1(aim, nameArr) {    let result = []    for(let i = 0; i < nameArr.length; i++) {        result.push(aim.find(item => item.name = nameArr[i]))    }    return result}// 输入 aim ['Anne','Jay'] //期望输出为 [{name:'Anne', age: 23, gender:'female'},{name:'Jay', age: 19, gender:'male'}]console.log(filterByName1(aim,['Leila','Jay']))// 有BUG 改进后

多条件单数据筛选

根据单个名字或者单个年龄筛选,用filter方法,判断条件之间是或的关系。

// 根据名字或者年龄筛选function filterByName2(aim, name, age) {    return aim.filter(item => item.name == name || item.age == age)}console.log(filterByName2(aim,'Leila',19))

多条件多数据筛选

我最初是用了很笨的双for循环去做,发现很慢,而且并没有达到预期的效果。具体的心路历程已经太遥远,简单介绍以下这个筛选算法。
首先是把筛选条件都塞到一个对象里,用object对象的keys方法获取到筛选的条件名,及需要筛选的是哪个条件,是name?age? gender?
然后使用filter方法对目标数据进行筛选,?如下⬇️
根据名字和年龄多元素筛选

//根据名字和年龄多元素筛选export function multiFilter(array, filters) {  const filterKeys = Object.keys(filters)  // filters all elements passing the criteria  return array.filter((item) => {    // dynamically validate all filter criteria    return filterKeys.every(key => {        //ignore when the filter is empty Anne      if(!filters[key].length) return true      return !!~filters[key].indexOf(item[key])    })  })}var filters = {    name:['Leila', 'Jay'],    age:[]}

例如这里,判断每条数据的name值是否在filters.name数组里,是的话返回true,判断filters.age是空数组的话直接返回true,空数组是模拟了age条件被清空的情况,我们仍然能得到正确的筛选数据。

知识点1: Object.key() 获取数组索引或者对象属性

var arr = ['a', 'b', 'c'];console.log(Object.keys(arr)); // ["0", "1", "2"]var obj = { 0: 'a', 1: 'b', 2: 'c' };console.log(Object.keys(obj)); // ["0", "1", "2"]var anObj = { 100: 'a', 2: 'b', 7: 'c' };console.log(Object.keys(anObj)); // ["2", "7", "100"] 猜猜为啥?

知识点2: js里的falsy

falsy : 0 , false, "", null, undefined, NaN

在判断语句中,只有上面6种情况会是false,其余的都是true

var a;if(a!=null&&typeof(a)!=undefined&&a!=''){    //a有内容才执行的代码  }if(!!a){    //a有内容才执行的代码...  }

知识点3: Array.every 与 Array.some的区别

我的理解是在遍历数组的时候:

  • Array.every的条件是「与」的关系,全真为真,及条件全为true则为true,有一个false就返回false

  • Array.some的条件是「或」的关系,有真为真,条件有一个true就返回true,条件全为false的时候才返回false

下面举个?

// 判断每个名字都为Anne?let dataEvery = aim.every(item => item.name === 'Anne') // falselet dataEvery = aim.some(item => item.name === 'Anne') // true// 判断每个名字都是字符串?let dataEvery = aim.every(item => typeof item.name === 'string') // truelet dataEvery = aim.some(item => typeof item.name === 'string') // true

知识点4: 数组的深拷贝与浅拷贝

最近参与一些前端的面试工作,深拷贝与浅拷贝是我最爱问的问题之一。一个问题就考察了数据类型,数组操作,递归算法等。

因为数组是js里的引用类型,单纯复制时复制的是其引用关系。在对获取的数据进行筛选时,我并不希望影响原始数据,所以我要用到「深拷贝」得到与原始数据数据结构完全相同又相互独立的数据,而不是只复制其引用关系。

// 我常用方法,如果项目很大,不推荐let obj1 = JSON.parse(JSON.stringify(obj))// deepclonefunction deepClone(o1, o2) {    for (let k in o2) {        if (typeof o2[k] === 'object') {            o1[k] = {};            deepClone(o1[k], o2[k]);        } else {            o1[k] = o2[k];        }    }}

想一想:递归算法的优化

这个知识点与本文关系不大。? 抱歉之前的误导。

这个是看掘金小册前端面试指南看到的,讲算法的时候提了一下递归算法的优化,初见的时候又被惊艳到,还没有在项目里用到。感兴趣的可以试试,这个是斐波那契数列和。可以自己在浏览器里敲一下,试试不用缓存与用缓存的运算次数差别。

let count = 0;function fn(n) {    let cache = {};    function _fn(n) {        if (cache[n]) {            return cache[n];        }        count++;        if (n == 1 || n == 2) {            return 1;        }        let prev = _fn(n - 1);        cache[n - 1] = prev;        let next = _fn(n - 2);        cache[n - 2] = next;        return prev + next;    }    return _fn(n);}let count2 = 0;function fn2(n) {    count2++;    if (n == 1 || n == 2) {        return 1;    }    return fn2(n - 1) + fn2(n - 2);}

到此,相信大家对“JS怎么实现数组过滤从简单到多条件筛选”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

JS怎么实现数组过滤从简单到多条件筛选

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

JS怎么实现数组过滤从简单到多条件筛选

本篇内容主要讲解“JS怎么实现数组过滤从简单到多条件筛选”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JS怎么实现数组过滤从简单到多条件筛选”吧!目录单条件单数据筛选单条件多数据筛选多条件单数据
2023-06-20

PHP数组中怎么实现多条件筛选

这篇文章主要介绍“PHP数组中怎么实现多条件筛选”,在日常操作中,相信很多人在PHP数组中怎么实现多条件筛选问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”PHP数组中怎么实现多条件筛选”的疑惑有所帮助!接下来
2023-07-06

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录