js实现lodash 的 differenceBy 方法
时间: 2023-07-09 20:36:22 浏览: 48
好的,以下是使用纯JavaScript实现lodash的differenceBy方法的代码:
```javascript
function differenceBy(arr1, arr2, iteratee) {
// 将数组中每个元素都应用iteratee函数,生成对应的属性值
const arr2Values = new Set(arr2.map(iteratee));
// 筛选出在arr1中存在,但在arr2中不存在的元素
return arr1.filter(obj => !arr2Values.has(iteratee(obj)));
}
// 示例
const arr1 = [{ 'x': 1 }, { 'x': 2 }, { 'x': 3 }];
const arr2 = [{ 'x': 1 }, { 'x': 2 }];
const result = differenceBy(arr1, arr2, 'x');
console.log(result);
// => [{ 'x': 3 }]
```
在上面的代码中,我们使用了ES6的Set对象来存储arr2中的属性值,然后筛选出在arr1中存在,但在arr2中不存在对应属性值的元素。请注意,这个实现与lodash的differenceBy方法并不完全相同,因为它只支持一个属性的比较,而lodash的实现则是支持多个属性的比较。
相关问题
每天一个lodash方法-differenceBy
好的,lodash的differenceBy方法可以用来比较两个数组之间的差异,并且可以指定比较的属性。具体使用方法如下:
首先,在你的项目中安装lodash库:
```
npm install lodash
```
然后在代码中引入lodash库:
```javascript
const _ = require('lodash');
```
接着,我们可以使用differenceBy方法进行数组比较:
```javascript
const arr1 = [{ 'x': 1 }, { 'x': 2 }, { 'x': 3 }];
const arr2 = [{ 'x': 1 }, { 'x': 2 }];
const result = _.differenceBy(arr1, arr2, 'x');
console.log(result);
// => [{ 'x': 3 }]
```
在上面的例子中,我们比较了arr1和arr2两个数组之间的差异,使用了x属性进行比较,并且返回了arr1中有而arr2中没有的元素。
lodash 实现cloneDeep方法
好的,以下是 Lodash 库中 `cloneDeep` 方法的实现:
```javascript
function cloneDeep(value) {
if (typeof value !== 'object' || value === null) {
return value;
}
let result;
if (Array.isArray(value)) {
result = [];
for (let i = 0; i < value.length; i++) {
result[i] = cloneDeep(value[i]);
}
} else {
result = {};
for (const key in value) {
if (Object.prototype.hasOwnProperty.call(value, key)) {
result[key] = cloneDeep(value[key]);
}
}
}
return result;
}
```
这个实现和上面的 Vue3+TypeScript 版本的实现类似。它也是递归地遍历对象,对于基本类型或者 null,直接返回原值;对于数组类型,递归地对数组中的每个元素进行深拷贝;对于对象类型,递归地对对象的每个属性进行深拷贝,并将结果保存到新的对象中。最后返回新的对象即可。
Lodash 的 `cloneDeep` 方法可能会有一些优化,例如对于某些类型的对象(如 Date、RegExp 等),可能会有特殊处理。但是总体来说,它和上面的实现思路类似。