在javascript中获取数组交集的推荐方法是结合set和filter,1. 对于原始值数组,将一个数组转换为set,利用其o(1)查找效率,再用filter筛选出另一数组中存在于set的元素,实现o(m+n)时间复杂度;2. 对于对象数组,需指定比较键(如id),将第二个数组的键值构建成set,再过滤第一个数组中键值存在于set的对象;3. 实际选择算法时应权衡数组大小、数据类型、代码可读性及是否引入工具库,优先推荐set方案以兼顾性能与简洁性,该方法完整有效且适用于大多数场景。

在JavaScript中,获取数组的交集并没有一个像Python或Ruby那样直接的
intersection
Set
要获取两个数组的交集,我个人最推荐且最常用的方法是结合
Set
filter
首先,我们可以将其中一个数组转换成
Set
Set
has()
includes()
Set
has()
/**
* 获取两个数组的交集(适用于原始值,如数字、字符串)
* @param {Array} arr1 第一个数组
* @param {Array} arr2 第二个数组
* @returns {Array} 两个数组的交集
*/
const getIntersection = (arr1, arr2) => {
// 为了性能考虑,将较短的数组转换为Set,或者干脆默认转换第二个数组
// 这样在filter时,Set的has操作会更有效率
const set2 = new Set(arr2);
// 使用filter过滤arr1中的元素,只保留set2中存在的
const intersection = arr1.filter(item => set2.has(item));
return intersection;
};
// 示例用法:
// const arrA = [1, 2, 3, 4, 5];
// const arrB = [3, 4, 5, 6, 7];
// console.log(getIntersection(arrA, arrB)); // 输出: [3, 4, 5]
// 另一个例子
// const arrC = ['apple', 'banana', 'orange'];
// const arrD = ['grape', 'banana', 'kiwi', 'apple'];
// console.log(getIntersection(arrC, arrD)); // 输出: ['apple', 'banana']这个方法直观、高效,是我在日常开发中处理原始值数组交集时的首选。
在处理数组交集,特别是当数组规模达到成千上万甚至更大时,性能考量就变得尤为重要。对于小数组来说,可能你用一个简单的双层循环(比如
filter
includes
includes
Set
我刚才推荐的
Set
Set
Set
set.has(element)
includes()
所以,一个基于
filter
Set
Set
filter
Set
arr1.filter(item => arr2.includes(item))
Set
includes
这是一个非常常见的场景,也经常让人头疼。因为JavaScript中对象的比较是基于引用的,也就是说,
{ id: 1 } === { id: 1 }false
Set
includes
要获取包含对象的数组交集,我们需要定义一个“相等”的标准。通常,我们会根据对象的一个或多个唯一属性(比如
id
uuid
name
实现这种交集,我的做法通常是这样的:
/**
* 获取包含对象的数组交集,根据指定键进行比较
* @param {Array<Object>} arr1 第一个对象数组
* @param {Array<Object>} arr2 第二个对象数组
* @param {string} key 用于比较对象的唯一键名 (e.g., 'id', 'name')
* @returns {Array<Object>} 两个数组的交集对象
*/
const getObjectIntersection = (arr1, arr2, key) => {
if (!key) {
console.warn("未指定用于比较的键名,可能导致非预期结果。");
// 也可以选择抛出错误或者默认使用一个通用比较
return [];
}
// 同样,为了效率,我们先构建一个Set,但这次Set里存储的是用于比较的键值
const set2Keys = new Set(arr2.map(item => item[key]));
// 过滤arr1中的对象,如果其指定键的值存在于set2Keys中,则保留
const intersection = arr1.filter(item => set2Keys.has(item[key]));
return intersection;
};
// 示例用法:
// const users1 = [
// { id: 1, name: 'Alice' },
// { id: 2, name: 'Bob' },
// { id: 3, name: 'Charlie' }
// ];
// const users2 = [
// { id: 2, name: 'Bob' },
// { id: 3, name: 'Charlie' },
// { id: 4, name: 'David' }
// ];
// console.log(getObjectIntersection(users1, users2, 'id'));
/*
输出:
[
{ id: 2, name: 'Bob' },
{ id: 3, name: 'Charlie' }
]
*/这种方法的核心在于,我们把对象的比较问题转换成了原始值的比较问题,因为
id
key
Set
选择合适的交集算法,这事儿吧,真得看具体情况。没有哪个算法是万能的“银弹”,但我们可以根据几个关键因素来做决策:
数组的大小:
filter
includes
Set
Set
数据类型:
Set
Set
filter
Set
代码的可读性与维护性:
Set
Set
是否允许引入外部库:
_.intersection
总的来说,我的经验是:优先考虑
Set
Set
key
以上就是js 如何使用intersection获取数组交集的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号