通过lodash判断对象类型数组元素之间的包含关系及获取差异值

本文介绍如何利用differenceWith函数结合isEqual进行复杂类型数组的差异对比,通过示例展示如何从目标数组中筛选出未在比较数组中出现的元素。

differenceWith函数接收三个参数,第一个是目标数组,第二个是拿来做比较的数组,第三个是规则,函数返回值是目标数组arr所有元素中不存在比较数组arr1中的值组成的新数组isEqual函数是用来判断复杂类型的数据是否相等的

//引入lodash
import _ from 'lodash'

let differentArr = _.differenceWith(arr, arr1, _.isEqual);

//举个例子
let arr= [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];
let arr1 = [{ 'x': 1, 'y': 2 }];
_.differenceWith(arr, arr1, _.isEqual);
// => [{ 'x': 2, 'y': 1 }]
### 使用 Lodash 实现对象数组的深拷贝 Lodash 提供了一个非常强大的方法 `_.cloneDeep`,可以用来对复杂的数据结构(如对象、数组等)进行深拷贝。深拷贝意味着原始数据和复制后的数据是完全独立的,修改其中一方不会影响另一方。 以下是一个使用 Lodash 对对象数组进行深拷贝的示例代码: ```javascript // 引入 Lodash 库 const _ = require('lodash'); // 假设有一个对象数组 const originalArray = [ { id: 1, name: 'Alice', details: { age: 25 } }, { id: 2, name: 'Bob', details: { age: 30 } } ]; // 使用 _.cloneDeep 方法进行深拷贝 const copiedArray = _.cloneDeep(originalArray); // 修改原始数组中的某个属性 originalArray[0].details.age = 30; // 检查深拷贝后的数组是否受到影响 console.log(copiedArray[0].details.age); // 输出结果为 25,说明深拷贝成功[^1] ``` 在上述代码中,`_.cloneDeep` 方法确保了即使对象数组包含嵌套的对象或数组,它们也会被递归地复制,从而实现真正的深拷贝[^2]。 ### 注意事项 1. **循环引用问题**:如果对象数组中存在循环引用(即某个对象引用了自身或其他祖先对象),`_.cloneDeep` 可能会导致无限递归并最终抛出错误。需要特别注意输入数据的结构。 2. **性能问题**:对于非常大的对象或数组,深拷贝可能会消耗较多的时间和内存资源。在这种情况下,可以考虑浅拷贝或其他优化策略[^3]。 3. **特殊类型的支持**:Lodash 的 `_.cloneDeep` 方法支持多种复杂类型的深拷贝,包括函数、正则表达式、日期、Map、Set 等[^4]。 ### 示例扩展:结合去重和映射操作 如果需要在深拷贝的同时对数据进行去重或映射操作,可以结合 Lodash 的其他方法,例如 `_.unionBy` 和 `_.map`: ```javascript // 引入 Lodash 库 const _ = require('lodash'); // 假设有一个可能包含重复项的对象数组 const originalArray = [ { type: 'A', name: 'Module A' }, { type: 'B', name: 'Module B' }, { type: 'A', name: 'Module A' } // 重复项 ]; // 使用 _.cloneDeep 和 _.unionBy 进行深拷贝并去重 const uniqueArray = _.cloneDeep(_.unionBy(originalArray, 'type')); // 对结果进行映射操作 const resultArray = uniqueArray.map(item => ({ type: item.type, name: item.name.toUpperCase() // 转换名称为大写 })); console.log(resultArray); // 输出结果为: // [ // { type: 'A', name: 'MODULE A' }, // { type: 'B', name: 'MODULE B' } // ] ``` 上述代码展示了如何将深拷贝与去重、映射等操作结合,以满足更复杂的业务需求[^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值