js取数组两个数组的交集|差集|并集|补集|去重

本文介绍JavaScript中数组的各种实用操作方法,包括迭代、唯一化、集合运算等,通过具体示例展示了如何高效地处理数组数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/**
* each是一个集合迭代函数,它接受一个函数作为参数和一组可选的参数
* 这个迭代函数依次将集合的每一个元素和可选参数用函数进行计算,并将计算得的结果集返回
{%example
<script>
     var a = [1,2,3,4].each(function(x){return x > 2 ? x : null});
     var b = [1,2,3,4].each(function(x){return x < 0 ? x : null});
     alert(a);
     alert(b);
</script>
%}
* @param {Function} fn 进行迭代判定的函数
* @param more ... 零个或多个可选的用户自定义参数
* @returns {Array} 结果集,如果没有结果,返回空集
*/
Array.prototype.each = function(fn){
    fn = fn || Function.K;
     var a = [];
     var args = Array.prototype.slice.call(arguments, 1);
     for(var i = 0; i < this.length; i++){
         var res = fn.apply(this,[this[i],i].concat(args));
         if(res != null) a.push(res);
     }
     return a;
};

/**
* 得到一个数组不重复的元素集合<br/>
* 唯一化一个数组
* @returns {Array} 由不重复元素构成的数组
*/
Array.prototype.uniquelize = function(){
     var ra = new Array();
     for(var i = 0; i < this.length; i ++){
         if(!ra.contains(this[i])){
            ra.push(this[i]);
         }
     }
     return ra;
};

/**
* 求两个集合的补集
{%example
<script>
     var a = [1,2,3,4];
     var b = [3,4,5,6];
     alert(Array.complement(a,b));
</script>
%}
* @param {Array} a 集合A
* @param {Array} b 集合B
* @returns {Array} 两个集合的补集
*/
Array.complement = function(a, b){
     return Array.minus(Array.union(a, b),Array.intersect(a, b));
};

/**
* 求两个集合的交集
{%example
<script>
     var a = [1,2,3,4];
     var b = [3,4,5,6];
     alert(Array.intersect(a,b));
</script>
%}
* @param {Array} a 集合A
* @param {Array} b 集合B
* @returns {Array} 两个集合的交集
*/
Array.intersect = function(a, b){
     return a.uniquelize().each(function(o){return b.contains(o) ? o : null});
};

/**
* 求两个集合的差集
{%example
<script>
     var a = [1,2,3,4];
     var b = [3,4,5,6];
     alert(Array.minus(a,b));
</script>
%}
* @param {Array} a 集合A
* @param {Array} b 集合B
* @returns {Array} 两个集合的差集
*/
Array.minus = function(a, b){
     return a.uniquelize().each(function(o){return b.contains(o) ? null : o});
};

/**
* 求两个集合的并集
{%example
<script>
     var a = [1,2,3,4];
     var b = [3,4,5,6];
     alert(Array.union(a,b));
</script>
%}
* @param {Array} a 集合A
* @param {Array} b 集合B
* @returns {Array} 两个集合的并集
*/
Array.union = function(a, b){
     return a.concat(b).uniquelize();
};



 

<think>好的,我现在需要帮用户写一篇关于数组和Set.prototype的交集差集输出对比实例的文章。首先,我需要确认用户的需求是什么。他们可能是在学习JavaScript中的数据结构操作,想了解如何利用数组和Set来实现这些合操作。用户可能已经知道数组和Set的基本用法,但需要具体的实现方法和对比实例。 接下来,我得考虑数组和Set在JavaScript中的区别。Set是ES6引入的,它存储唯一值,而数组可以包含复元素。所以在处理合操作时,使用Set可能会更高效,尤其是在方面。但用户可能想知道如何用数组实现同样的操作,或者两者的实现方式有什么不同。 然后,我需要确定交集差集的定义。交集两个合中都存在的元素,是两者的所有唯一元素,差集是存在于一个合但不在另一个中的元素。对于数组来说,可能需要处理复元素的情况,而Set自动,所以结果可能会有差异。 接下来,我需要思考如何用数组和Set分别实现这些操作。比如,数组交集可以通过filter方法结合includes或indexOf来实现,而Set可以利用其has方法更高效地检查元素存在。同样,对于数组可能需要合,而Set直接合两个Set即可。差集的实现也类似,数组用filter,Set用has方法。 然后,我需要考虑对比实例。应该给出数组和Set各自的实现代码,展示运行结果,比较两者的不同。例如,当数组中有复元素时,交集的结果是否包含复项,而Set的结果会自动。这能帮助用户理解在不同情况下选择哪种数据结构更合适。 同时,用户可能关心性能和效率的问题。使用Set的方法通常时间复杂度更低,因为查找操作是O(1),而数组的includes是O(n)。在处理大数据量时,Set的优势会更明显。这也是需要提到的点。 另外,可能需要注意Set和数组之间的转换。比如,将数组转换为Set可以通过new Set(array),而将Set转回数组可以用Array.from(set)或者展开运算符[...set]。这些操作在实现合方法时会经常用到,需要明确写出步骤。 还要考虑代码的可读性和简洁性。使用Set的代码可能更简洁,而数组的方法虽然直观,但代码量可能更多。这也是用户可能关心的地方,特别是对于初学者来说,清晰的代码示例很要。 最后,总结部分需要对比两者的优缺点,指出在不同场景下的适用性。比如,如果需要处理复元素或者需要索引操作,数组更合适;如果注元素唯一性和高效查找,Set更好。 在写实例的时候,需要确保代码正确无误,且结果清晰展示差异。例如,用数组的示例可能包含复元素,而Set的结果自动,这样用户能直观看到两者的区别。 可能还需要提醒用户注意一些常见问题,比如数组方法中引用类型的元素比较问题,因为对象引用不同会导致includes等方法失效,而Set处理对象引用时也是基于引用一致性。这种情况下,可能需要更复杂的处理方式,但可能超出当前主题范围,可以简要提及。 总之,我需要结构清晰,先介绍概念,再分别用数组和Set展示实现方法,给出对比实例,最后总结两者的适用场景和优缺点。确保用户能够通过这篇文章理解如何在不同情况下选择合适的数据结构进行合操作。</think>以下是一篇关于数组与 `Set.prototype` 实现合操作(交集差集)的对比介绍,包含代码实例和结果分析: --- # 数组与 Set.prototype 的合操作对比 在 JavaScript 中,**数组**和 **`Set`** 是两种常用的数据结构。数组允许复元素且有序,`Set` 则自动且元素唯一。在处理合操作时,两者各有优劣,以下是具体实现与对比。 --- ## 一、交集(Intersection) **定义**:两个合中共同存在的元素。 ### 1. 数组实现 ```javascript const arrayIntersection = (arr1, arr2) => { return arr1.filter(item => arr2.includes(item)); }; ``` ### 2. Set 实现 ```javascript const setIntersection = (set1, set2) => { return new Set([...set1].filter(item => set2.has(item))); }; ``` ### 示例与结果 ```javascript const arr1 = [1, 2, 2, 3]; const arr2 = [2, 3, 4]; const set1 = new Set(arr1); const set2 = new Set(arr2); console.log(arrayIntersection(arr1, arr2)); // [2, 2, 3](保留复) console.log([...setIntersection(set1, set2)]); // [2, 3](自动) ``` --- ## 二、(Union) **定义**:两个合中所有唯一元素的合。 ### 1. 数组实现 ```javascript const arrayUnion = (arr1, arr2) => { return [...new Set([...arr1, ...arr2])]; }; ``` ### 2. Set 实现 ```javascript const setUnion = (set1, set2) => { return new Set([...set1, ...set2]); }; ``` ### 示例与结果 ```javascript console.log(arrayUnion(arr1, arr2)); // [1, 2, 3, 4] console.log([...setUnion(set1, set2)]); // [1, 2, 3, 4] ``` --- ## 三、差集(Difference) **定义**:存在于合 A 但不在合 B 中的元素。 ### 1. 数组实现 ```javascript const arrayDifference = (arr1, arr2) => { return arr1.filter(item => !arr2.includes(item)); }; ``` ### 2. Set 实现 ```javascript const setDifference = (set1, set2) => { return new Set([...set1].filter(item => !set2.has(item))); }; ``` ### 示例与结果 ```javascript console.log(arrayDifference(arr1, arr2)); // [1](保留原数组结构) console.log([...setDifference(set1, set2)]); // [1] ``` --- ## 四、性能与特性对比 | 操作 | 数组实现特点 | Set 实现特点 | |----------|---------------------------------------|--------------------------------------| | **** | 需要手动(如 `new Set()` 辅助) | 自动,天然适合合操作 | | **时间复杂度** | `includes()` 为 O(n),数据量大时较慢 | `has()` 为 O(1),性能更优 | | **结果类型** | 返回数组,保留原始顺序和复项 | 返回 Set,元素唯一但无序 | | **代码简洁性** | 需要更多代码处理和过滤 | 代码更简洁,直接利用 Set 方法 | --- ## 五、总结 - **使用数组**:适合需要保留复元素、顺序敏感的场景。 - **使用 Set**:适合元素唯一性要求高、需要高效查找(如大数据量)的场景。 根据需求选择数据结构,二者也可结合使用(如用 Set 后再转数组)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值