Vue基础(14)_列表过滤、列表排序

Array.prototype.filter()【ES5】

filter() 方法创建给定数组一部分的浅拷贝,其包含通过所提供函数实现的测试的所有元素。

语法:
filter(callbackFn)
filter(callbackFn, thisArg)

参数:
callbackFn(回调函数) :为数组中的每个元素执行的函数。它应该返回一个真值以将元素保留在结果数组中,否则返回一个假值。 该函数被调用时将传入以下参数:

element:数组中当前正在处理的元素。

index:正在处理的元素在数组中的索引。

array:调用了 filter() 的数组本身。

thisArg(可选):执行 callbackFn 时用作 this 的值。

返回值:
**返回给定数组的一部分的浅拷贝,其中只包括通过提供的函数实现的测试的元素。**如果没有元素通过测试,则返回一个空数组。

筛选排除所有较小的值:

以下示例使用 filter() 创建一个过滤数组,该数组删除了所有值小于 10 的元素。

javascript 复制代码
function isBigEnough(value) {
  return value >= 10;
}
const filtered = [12, 5, 8, 130, 44].filter(isBigEnough);
// filtered is [12, 130, 44]

在数组中搜索:

下例使用 filter() 根据搜索条件来过滤数组内容。

javascript 复制代码
const fruits = ["apple", "banana", "grapes", "mango", "orange"];
/**
 * 根据搜索条件(查询)筛选数组项
 */
function filterItems(arr, query) {
  return arr.filter((el) => el.toLowerCase().includes(query.toLowerCase()));
}

console.log(filterItems(fruits, "ap")); // ['apple', 'grapes']
console.log(filterItems(fruits, "an")); // ['banana', 'mango', 'orange']

Array.prototype.includes()【ES7(2016)】

includes() 方法用来判断一个数组是否包含一个指定的值,根据情况,如果包含则返回 true,否则返回 false。

语法:
includes(searchElement)
includes(searchElement, fromIndex)

参数:
searchElement :需要查找的值。
fromIndex(可选) :开始搜索的索引(从零开始),会转换为整数。

①、负索引从数组末尾开始计数------如果 fromIndex < 0,那么实际使用的是 fromIndex + array.length**。然而在这种情况下,数组仍然从前往后进行搜索** 。

②、如果 fromIndex < -array.length 或者省略 fromIndex,则使用 0,这将导致整个数组被搜索。

③、如果 fromIndex >= array.length,则不会搜索数组并返回 false

返回值:
一个布尔值,如果在数组中(或者在 fromIndex 所指示的数组部分中,如果指定 fromIndex 的话)找到 searchElement 值,则该值为 true。

使用 includes() 方法:

javascript 复制代码
const array1 = [1, 2, 3];

console.log(array1.includes(2));
// Expected output: true

const pets = ["cat", "dog", "bat"];

console.log(pets.includes("cat"));
// Expected output: true

console.log(pets.includes("at"));
// Expected output: false

[1, 2, 3].includes(2); // true
[1, 2, 3].includes(4); // false
[1, 2, 3].includes(3, 3); // false
[1, 2, 3].includes(3, -1); // true
[1, 2, NaN].includes(NaN); // true
["1", "2", "3"].includes(3); // false

fromIndex 大于等于数组长度

如果 fromIndex 大于等于数组的长度,则将直接返回 false,且不搜索该数组。

javascript 复制代码
const arr = ["a", "b", "c"];

arr.includes("c", 3); // false
arr.includes("c", 100); // false

计算出的索引小于 0

如果 fromIndex 为负值,计算出的索引将作为开始搜索 searchElement 的位置。如果计算出的索引小于 0,则整个数组都会被搜索。

javascript 复制代码
// 数组长度为 3
// fromIndex 为 -100
// 计算出的索引为 3 + (-100) = -97

const arr = ["a", "b", "c"];

arr.includes("a", -100); // true
arr.includes("b", -100); // true
arr.includes("c", -100); // true
arr.includes("a", -2); // false

列表过滤、排序之实例演练:

html 复制代码
<!DOCTYPE html>
<html lang="zh">

<head>
    <meta charset="UTF-8">
    <title>列表过滤、列表排序</title>
    <script type="text/javascript" src="../js/vue.js"></script>
</head>

<body>
    <div id="root">
        <!-- 遍历对象数组 -->
        <h3>人员列表</h3>
        <input type="text" v-model:value="keyword">
        <button @click="sortType=1">年龄升序</button>
        <button @click="sortType=-1">年龄降序</button>
        <button @click="sortType=0">原顺序</button>
        <ul>
            <li v-for="p in selectPer" :key="p.id">
                {{p.name}}-{{p.age}}--{{p.sex}}
            </li>
        </ul>
    </div>
</body>

</html>

用计算属性(computed)实现:

javascript 复制代码
<script>
        new Vue({
            el: '#root',
            data: {
                keyword: '',
                sortType: '',
                persons: [
                    { id: '001', name: '马小琴', age: 29, sex: '女' },
                    { id: '002', name: '周晓雨', age: 30, sex: '女' },
                    { id: '003', name: '周啸天', age: 28, sex: '男' },
                    { id: '004', name: '李耀宗', age: 29, sex: '男' },
                    { id: '005', name: '周晓霞', age: 42, sex: '女' },
                    { id: '006', name: '李国庆', age: 22, sex: '男' },
                    { id: '007', name: '马晓晴', age: 36, sex: '女' }
                ]
            },
            computed: {
                selectPer() {
                    const arr = this.persons.filter(
                        p => p.name.includes(this.keyword)
                    )
                    switch (this.sortType) {
                        case 1: return arr.sort((a, b) => a.age - b.age); break;
                        case -1: return arr.sort((a, b) => b.age - a.age); break;
                        default: return arr; break
                    }
                }
            }
        })
</script>

用侦听属性(watch)实现:

javascript 复制代码
 <script>
        new Vue({
            el: '#root',
            data: {
                keyword: '',
                sortType: '',
                persons: [
                    { id: '001', name: '马小琴', age: 29, sex: '女' },
                    { id: '002', name: '周晓雨', age: 30, sex: '女' },
                    { id: '003', name: '周啸天', age: 28, sex: '男' },
                    { id: '004', name: '李耀宗', age: 29, sex: '男' },
                    { id: '005', name: '周晓霞', age: 42, sex: '女' },
                    { id: '006', name: '李国庆', age: 22, sex: '男' },
                    { id: '007', name: '马晓晴', age: 36, sex: '女' }
                ],
                selectPer: []
            },
            watch: {
                'keyword': {
                    // 立即执行一次监听。此时keyword为空字符,匹配返回真(true),打印全数组。
                    immediate: true,
                    handler() {
                        this.selectPer = this.persons.filter(
                            p => p.name.includes(this.keyword)
                        )
                    }
                },
                'sortType'() {
                    switch (this.sortType) {
                        case 1: this.selectPer.sort((a, b) => a.age - b.age); break;
                        case -1: this.selectPer.sort((a, b) => b.age - a.age); break;
                        default: this.selectPer = this.persons.filter(
                            p => p.name.includes(this.keyword)
                        ); break
                    }
                }
            }
        })
    </script>
相关推荐
诗书画唱3 分钟前
【前端面试题】JavaScript 核心知识点解析(第二十二题到第六十一题)
开发语言·前端·javascript
excel10 分钟前
前端必备:从能力检测到 UA-CH,浏览器客户端检测的完整指南
前端
前端小巷子17 分钟前
Vue 3全面提速剖析
前端·vue.js·面试
悟空聊架构23 分钟前
我的网站被攻击了,被干掉了 120G 流量,还在持续攻击中...
java·前端·架构
CodeSheep25 分钟前
国内 IT 公司时薪排行榜。
前端·后端·程序员
尖椒土豆sss29 分钟前
踩坑vue项目中使用 iframe 嵌套子系统无法登录,不报错问题!
前端·vue.js
遗悲风29 分钟前
html二次作业
前端·html
江城开朗的豌豆33 分钟前
React输入框优化:如何精准获取用户输入完成后的最终值?
前端·javascript·全栈
CF14年老兵33 分钟前
从卡顿到飞驰:我是如何用WebAssembly引爆React性能的
前端·react.js·trae
画月的亮36 分钟前
前端处理导出PDF。Vue导出pdf
前端·vue.js·pdf