JS数组中的filter方法

本文探讨了一维数组使用filter方法筛选元素的实践,并深入到二维数组的处理,通过forEach结合filter实现了对嵌套数组中特定条件元素的筛选,提高了代码的可读性和效率。

一维数组:

const arr = [1,2,3].filter((v)= > {
     console.log(v);  //输出为1,2,3
     return v>1;
})
console.log(arr);  //输出为[2,3];

二维数组:

let data = [{
    a: [{re:true},{re:false}]
    b: '123'
},
{
    a: [{re:true},{re:false}]
    b: '123'
}
]
 
// 借助forEach解决最外重循环
let newArray = []
data.forEach((now,index)=>{
    newArray[index] = now
    newArray[index].a = now.a.filter((item) => {
        return item.re === true
    })     
})
console.log(newArray)  // [{a: [{re:true}]b: '123'},{a: [{re:true}]b:'123'}]
 
// 不比双重forEach简洁多少,而且filter只适合在最后一层用,如果是三维数组,还是要forEach两遍,但是可读性感觉强了一些

 

<think> 我们正在讨论JavaScript数组filter方法。根据用户的要求,我们需要提供filter方法的使用指南。 引用[1]中提到了filter方法filter() 创建一个新数组,包含通过测试的所有元素。 引用[2]展示了使用slice()来创建新数组(不改变原数组)的好做法,这与filter方法的不改变原数组特性一致。 引用[3]提到了fill()方法会修改原始数组(就地方法),而filter()则不会修改原数组,而是返回一个新数组。 因此,我们可以这样组织回答: 1. 解释filter方法的作用:创建一个新数组,其中包含通过所提供函数实现的测试的所有元素。 2. 语法:arr.filter(callback(element[, index[, array]])[, thisArg]) 3. 参数说明:callback是一个测试函数,返回true表示保留该元素,否则不保留。它接受三个参数:当前元素、索引(可选)、原数组(可选)。thisArg可选,指定callback中this的值。 4. 返回值:一个新的通过测试的元素组成的数组,如果没有通过测试则返回空数组。 5. 特点:filter不会改变原数组(与引用[3]中fill方法相反)。 6. 示例:给出几个示例代码,展示不同用法。 7. 注意事项:比如在稀疏数组上的行为等。 同时,我们生成相关问题。 </think> ### JavaScript数组`filter()`方法使用指南 `filter()`是JavaScript数组的核心方法,用于**基于条件筛选元素并创建新数组**。它不会修改原数组(与`splice()`等改变原数组方法相反[^2]),而是返回满足条件的新数组。 #### 一、基本语法 ```javascript const newArray = array.filter(callback(element[, index[, array]]) { // 返回true保留元素,false则排除 }[, thisArg]) ``` - **参数说明**: - `callback`:测试函数,对每个元素执行 - `element`:当前处理的元素(必需) - `index`:当前元素的索引(可选) - `array`:原数组本身(可选) - `thisArg`:执行回调时用作`this`的对象(可选) #### 二、使用示例 1. **基础数值过滤** 筛选大于10的数字: ```javascript const numbers = [8, 12, 5, 17]; const result = numbers.filter(num => num > 10); console.log(result); // [12, 17] ``` 2. **对象数组过滤** 筛选状态为"active"的用户: ```javascript const users = [ {id: 1, name: "Alice", status: "active"}, {id: 2, name: "Bob", status: "inactive"}, {id: 3, name: "Charlie", status: "active"} ]; const activeUsers = users.filter(user => user.status === "active"); /* 输出: [ {id:1, name:"Alice", status:"active"}, {id:3, name:"Charlie", status:"active"} ] */ ``` 3. **结合索引过滤** 保留索引为偶数的元素: ```javascript const letters = ['a', 'b', 'c', 'd']; const filtered = letters.filter((_, index) => index % 2 === 0); console.log(filtered); // ['a', 'c'] ``` #### 三、核心特性 1. **不改变原数组**(与`fill()[^3]`/`splice()[^2]`相反) ```javascript const arr = [1, 2, 3]; const filtered = arr.filter(x => x > 1); console.log(arr); // [1, 2, 3] (数组不变) console.log(filtered); // [2, 3] ``` 2. **自动跳过空槽位** 处理稀疏数组时忽略空元素: ```javascript [1, , 3].filter(x => true); // [1, 3] ``` 3. **链式调用支持** 可与其他数组方法组合: ```javascript const products = [ {name: "Laptop", price: 1200}, {name: "Mouse", price: 25}, {name: "Keyboard", price: 80} ]; const affordable = products .filter(p => p.price < 100) .map(p => p.name); // ["Mouse", "Keyboard"] ``` #### 四、注意事项 1. **始终返回新数组**:若无元素通过测试,返回空数组`[]` 2. **性能考量**:处理超大数组时需优化回调函数逻辑 3. **稀疏数组处理**:空元素不会被传递给回调函数[^1] > **应用场景**:数据清洗、搜索过滤、权限验证等需要条件筛选的场景。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值