js实现一维、二维数组去重

该博客主要介绍使用JS实现数组去重,包括一维数组和二维数组。先定义两个任意数组,接着分别进行一维和二维数组去重操作,最后展示执行结果,聚焦于信息技术中JS数组处理。

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

js实现一维、二维数组去重

定义两个任意数组:

var a=["1","2","4","1","o","dd","bbs1","ooi","a","6","a","s","2","89","89"];
var b=["1","5","7","5","o","ff","bbs","ww","a","6","a","s","2","3","89","ff"];

一维数组去重

function unique1(arr){
   var c = [];
     for(var i=0;i<arr.length;i++){
         if(c.indexOf(arr[i]) === -1){
             c.push(arr[i]);
         }
     }
     return c;
 }

二维数组去重

function diff(arr1,arr2){
     arr1 = unique1(arr1); // 数组中重复元素去掉
     arr2 = unique1(arr2); // 数组中重复元素去掉
     var d =[];
     var e = [];
     for(var i=0;i<arr1.length;i++){
         if(arr2.indexOf(arr1[i]) === -1){
             d.push(arr1[i])
          }
     }
     for(var j=0;j<arr2.length;j++){
         if(arr1.indexOf(arr2[j]) == -1){
             e.push(arr2[j])
         }
     }
     return {
          d,e
     }
 }

执行结果

console.log(diff(a,b))
<think>嗯,用户想了解如何用JavaScript对二维数组进行。首先,我得回忆一下常见的数组方法,比如用Set或者遍历比较。不过二维数组的话,里面的元素是数组,而Set在处理对象引用时,无法直接判断是否复,因为不同的数组实例即使内容相同,也被视为不同的。所以直接转成字符串可能是个办法,比如把每个子数组用JSON.stringify转成字符串,然后存到Set里,最后再转换回来。 不过,这样可能会有问题吗?比如,子数组里的元素顺序不同,比如[1,2]和[2,1]会被视为不同的字符串,但用户可能希望它们算复。这时候是否需要先对子数组排序后再处理?用户的需求可能有两种情况:一种是严格保持子数组顺序相同才算复,另一种是元素相同但顺序不同也算复。这时候可能需要分情况讨论,或者给出不同的解决方案。 另外,效率也是一个考虑点。如果数组很大,转换成字符串可能会影响性能。这时候有没有更好的方法?比如遍历数组,逐个比较子数组的内容是否相同。不过这样的时间复杂度会比较高,是O(n²),对于大数据量可能不合适。所以需要根据使用场景来选择合适的方案。 然后,我应该给出具体的代码示例。比如,使用Set和JSON的方法,或者结合排序的方法。同时,还要注意处理特殊情况,比如子数组中包含对象或者其他非基本类型的数据,这时候JSON.stringify可能会有问题,比如对象属性顺序不同导致字符串不同。不过用户的问题是关于二维数组,可能里面的元素都是基本类型,比如数字或者字符串,所以暂时可以忽略这种情况。 另外,还要考虑代码的兼容性。Set在ES6之后支持,所以如果需要支持旧浏览器可能需要转译。不过大多数现代环境应该没问题。 总结步骤的话,应该是: 1. 遍历原数组的每个子数组。 2. 将子数组转换为字符串,比如用JSON.stringify。 3. 利用Set这些字符串。 4. 将后的字符串转换回数组。 或者,如果考虑元素顺序无关,先排序子数组再转换字符串。 最后,给出这两种情况的代码示例,并说明它们的区别和适用场景。</think>在JavaScript中对二维数组,需根据子数组内容进行判断。以下是分步解决方案: 一、基础方法(顺序敏感) ```javascript function unique2DArray(arr) { const seen = new Set(); return arr.filter(subArr => { const key = JSON.stringify(subArr); return seen.has(key) ? false : seen.add(key); }); } // 示例 const arr = [[1,2], [3,4], [1,2], [5,6]]; console.log(unique2DArray(arr)); // 输出 [[1,2], [3,4], [5,6]] ``` 原理说明: 1. 使用`Set`存储序列化后的子数组字符串 2. 通过`JSON.stringify`将子数组转为唯一标识 3. 利用`filter`实现过滤 二、顺序不敏感版本(元素相同即视为复) ```javascript function unique2DArrayUnordered(arr) { const seen = new Set(); return arr.filter(subArr => { const sorted = [...subArr].sort(); const key = JSON.stringify(sorted); return seen.has(key) ? false : seen.add(key); }); } // 示例 const arr = [[2,1], [1,2], [3,4], [4,3]]; console.log(unique2DArrayUnordered(arr)); // 输出 [[2,1], [3,4]] ``` 三、性能优化建议 1. 大数据量时优先使用`new Set()`而不是数组遍历 2. 如果子数组元素都是原始类型,可用`join()`代替`JSON.stringify` ```javascript const key = subArr.join('|'); // 适用于数字/字符串且不含分隔符 ``` 四、特殊处理场景 1. 包含对象的二维数组: ```javascript // 需要自定义序列化方法 const key = subArr.map(item => JSON.stringify(item)).join('#'); ``` 五、注意事项 1. `JSON.stringify`对`undefined`和函数类型处理不一致 2. 浮点数精度问题(如1.0会被转为1) 3. 大数组建议使用Map替代Set提升性能 根据实际需求选择合适的方法,常规情况下基础方法即可满足大多数需求。如果数组元素顺序不影响等价判断,推荐使用排序后的优化版本。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值