理解Lodash differenceBy迭代器,自定义迭代器筛选大于5的差异值
嘿,我来帮你搞明白怎么用自定义迭代器让Lodash的_.differenceBy找出数组中大于5的差异元素。先从基础逻辑说起,再一步步实现需求~
理解Lodash
_.differenceBy 的迭代器作用 首先得明确:_.differenceBy的核心是根据迭代器生成的「比较标识」,找出第一个数组里存在、但第二个数组里不存在的元素。迭代器的作用就是给每个元素生成一个用于对比的“标准值”——官方文档说的「生成元素比较的判断标准」就是这个意思。
先看官方示例的逻辑
官方给的例子很直观:
_.differenceBy([1, 2, 3, 5, 6], [1, 2, 3, 8, 10], Math.floor); // [5, 6]
这里用Math.floor当迭代器,因为所有元素都是整数,处理后的值和原元素完全一致,所以本质就是找两个数组的差异元素:5和6。
如果要自己实现Math.floor的迭代器逻辑,写法也很简单:
// 自定义迭代器,复刻Math.floor的逻辑 let iter_floor = (value) => { return Math.floor(value); }; // 调用_.differenceBy let result = _.differenceBy([1, 2, 3, 5, 6], [1, 2, 3, 8, 10], iter_floor); console.log(result); // 输出 [5, 6]
实现“筛选大于5的差异元素”的自定义迭代器
现在我们要实现的是:让_.differenceBy返回第一个数组中大于5且属于两个数组差异的元素。核心思路是:用自定义迭代器把不满足“>5”的元素映射成一个相同的标识(比如null),这样这些元素会被判定为和第二个数组中的对应标识重复,从而被排除在结果外。
编写自定义迭代器
// 自定义迭代器:大于5的元素返回自身(作为比较标识),否则返回null let iter_greater_than_5 = (value) => { return value > 5 ? value : null; };
调用_.differenceBy验证效果
举个实际的例子测试:
const arr1 = [3, 6, 7, 2, 9, 4]; const arr2 = [6, 10, 2]; const filteredResult = _.differenceBy(arr1, arr2, iter_greater_than_5); console.log(filteredResult); // 输出 [7, 9]
拆解逻辑为什么生效
我们一步步看每个元素的处理过程:
- 对
arr1的元素处理:3→null,6→6,7→7,2→null,9→9,4→null - 对
arr2的元素处理:6→6,10→10,2→null _.differenceBy会筛选出arr1中处理后的标识不在arr2标识集合里的元素:- 3、2、4的标识是
null,arr2里有2的标识也是null,所以被排除 - 6的标识是6,
arr2里有6,被排除 - 7的标识是7,
arr2里没有,保留 - 9的标识是9,
arr2里没有,保留
- 3、2、4的标识是
最终得到的[7,9]就是我们要的:arr1中大于5且不在arr2里的差异元素。
再换一组数据测试:
const result = _.differenceBy([1,5,6,8,11], [5,8,12], iter_greater_than_5); console.log(result); // 输出 [6,11]
完全符合预期——6和11是arr1独有的、且大于5的元素。
关键要点总结
_.differenceBy的迭代器不是直接筛选元素,而是生成比较标识,我们可以利用这一点把不需要的元素“归为一类”,让它们被自动排除。- 自定义迭代器的逻辑可以灵活调整,只要返回一个能准确区分你想要保留元素的标识就行(字符串、数字、对象都可以)。
内容的提问来源于stack exchange,提问作者Luis Reinoso
相关产品推荐
相关产品推荐

