You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

理解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里没有,保留

最终得到的[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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:33:51