从一个数组中过滤掉另一个数组中的元素

从一个数组中过滤掉另一个数组中的元素

ES6方法 some,every, filter 的用法

some() 方法

  • 有一个条件满足就会返回true 不会执行剩余的元素 ,全都不满足返回true
  • some() 不会对空数组检测
  • some() 不会改变原数组
var arr1=[1,5,3,4,8,6]
var i=0
let res=arr1.some(item=>{
i=i+1
return item>=3
})
console.log(i,res) 2 ,true
var arr1=[8,5,3,4,12,9]
var i=0
let res=arr1.some(item=>{
i=i+1
return item<=2
})
console.log(i,res) 6,false

every()方法

  • 每一项都满足条件返回true ,有一个不满足就返回false``
  • every() 不会对空数组检测
  • every() 不会改变原数组
var arr1=[9,5,2,4,8,6]
var i=0
let res=arr1.every(item=>{
i=i+1
return item>=3
})
console.log(i,res) 3 ,false
var arr1=[8,5,3,4,12,9]
var i=0
let res=arr1.every(item=>{
i=i+1
return item>=2
})
console.log(i,res) 6,true

some 用于判断数组是否存在某一项的时候,every 用于判断数组是否都满足条件的时候

filter()方法

  • filter() 创建一个新的数组,新数组的元素,是所有符合指定数组筛选条件的元素
  • filter() 不会对空数组进行检测。
  • filter() 不会改变原始数组。
   var array = [{ num: 3 }, { num: 8 }, { num: 34 }, { num: 23 }, { num: 79 }, { num: 12 }];
    var newArr = array.filter(item => item.num == 3)
    console.log(newArr,array) // [{num:9}] //[{ num: 3 }, { num: 8 }, { num: 34 }, { num: 23 }, { num: 79 }, { num: 12 }]

使用filter 数组

在一个数组中,过滤掉另一个数组里相同的数据,需要用到 filter和some 的混合方法,第一层用filter 过滤掉与第二个数组相同的元素(用some 的方法,排查出相同的元素然后取反,相同的元素就会被过滤掉)

 var arr1 = [{ key: '1', label: '001' }, { key: '2', label: '002' }, { key: '3', label: '003' }, { key: '4', label: '004' }] // 原数组
 var arr2 = [{ key: '1', label: '001' }, { key: '4', label: '004' }] // 已经选择过的数组
 function filterData (array1, array2) {
    let arr = []
    arr = array1.filter(item => {
      return !array2.some((val) => {
        return val.key === item.key
      })
    })
    return arr
  }
  console.log(filterData(arr1, arr2))
JavaScript 中,过滤数组中的**空元素**(如 `null`、`undefined`、`''`、`false`、`0` 等)或**空数组**(`[]`),需要根据具体需求来判断“空”的定义。以下是几种常见场景及对应的解决方案。 --- ### ✅ 场景一:过滤 `null`、`undefined`、`''`(空字符串)、`NaN` 等“假值”,但保留 `0` 和 `false` ```javascript const arr = [1, 0, '', null, undefined, 'hello', [], [1, 2], NaN]; const filtered = arr.filter(item => { // 保留 0 和 false,排除 null, undefined, '', NaN if (item === 0 || item === false) return true; return Boolean(item); }); console.log(filtered); // [1, 0, 'hello', [], [1, 2]] ``` > 🔍 解释:`Boolean(item)` 会把所有“假值”转为 `false`,但我们通过条件判断显式保留 `0` 和 `false`。 --- ### ✅ 场景二:过滤所有“假值”,包括 `0` 和 `false` ```javascript const arr = [1, 0, '', null, undefined, 'hello', [], [1, 2], false]; const filtered = arr.filter(Boolean); console.log(filtered); // [1, 'hello', [], [1, 2]] ``` > ⚠️ 注意:这种写法也会过滤 `0` 和 `false`,因为它们是“假值”。 --- ### ✅ 场景三:额外过滤“空数组” `[]` 有时候我们不仅想过滤假值,还想排除空数组。 ```javascript const arr = [1, 0, '', null, undefined, 'hello', [], [1, 2], [null], {}]; const filtered = arr.filter(item => { // 先处理基本假值(可选择是否保留 0 和 false) if (item === 0 || item === false) return true; if (!item) return false; // 过滤 null, undefined, '', NaN // 检查是否是空数组 if (Array.isArray(item) && item.length === 0) return false; return true; }); console.log(filtered); // [1, 0, 'hello', [1, 2], [null], {}] ``` > ✅ 只有长度为 0 的数组过滤,非空数组对象都保留。 --- ### ✅ 场景四:递归深度过滤 —— 数组嵌套中也去除空值和空数组 ```javascript function deepFilter(arr) { return arr .filter(item => { if (item === 0 || item === false) return true; if (!item) return false; if (Array.isArray(item) && item.length === 0) return false; return true; }) .map(item => { // 如果是数组,递归处理 if (Array.isArray(item)) { return deepFilter(item); } return item; }); } // 示例 const nested = [1, [], [null, undefined, '', [2, [], 3]], 0, false, 'ok', [[], []]]; console.log(deepFilter(nested)); // 输出: [1, [null, undefined, '', [2, 3]], 0, false, 'ok'] ``` > 🌟 这个版本可以处理多层嵌套数组,并清除每一层的空元素和空数组。 --- ### ✅ 场景五:使用 Lodash 简化操作(推荐用于复杂项目) 如果你使用了 [Lodash](https://lodash.com/) 库: ```bash npm install lodash ``` ```javascript import _ from 'lodash'; const arr = [1, 0, '', null, undefined, 'hello', [], [1, 2]]; // 去除假值(含空数组) const compacted = _.compact(arr); // [1, 0, 'hello', [1, 2]] // 再手动过滤数组 const result = _.compact(arr).filter(item => !(Array.isArray(item) && item.length === 0)); console.log(result); // [1, 0, 'hello', [1, 2]] ``` 或者更进一步: ```javascript const clean = arr.filter(item => { if (!item) return false; if (Array.isArray(item) && item.length === 0) return false; return true; }); ``` --- ### 小结:常用过滤逻辑总结 | 条件 | 代码 | |------|------| | 去除所有假值(含 `0`, `false`) | `arr.filter(Boolean)` | | 保留 `0` 和 `false`,只去 `null/undefined/''` | `item => item !== null && item !== undefined && item !== ''` | | 去除空数组 `[]` | `Array.isArray(item) && item.length > 0` | | 同时去除假值 + 空数组 | 见上面综合判断 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值