数组/对象去重

本文总结了多种JavaScript中去除数组重复元素的方法,包括使用Set、两层for循环结合splice、利用indexOf、includes、filter及Map等技术实现的去重算法。通过这些方法,可以有效地提高数组处理效率。

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

var arr=[1, 2, 3, 1, 3, '是是', '是是', '2', '测试', '服务', '测试', NaN, NaN, '服务', '服务'];  
arr=[...new Set(arr)];  
console.log(arr); 

  Set 是ES6新加的集合,集合中的值不会重复。 ...操作符 会将可遍历对象,转换为数组

let arr = [1,2,2,3,4,4,4];
let s = new Set(arr);
//结果:Set {1,2,3,4}

let newArr = Array.from(s);
//结果:[1,2,3,4],完成去重

 两层for循环+splice

var arrs=[1, 2, 3, 1, 3, '是是', '是是', '2', '测试', '服务', '测试', NaN, NaN, '服务', '服务'];  
var unique1 = arr => {
  let len = arr.length;
  for (let i = 0; i < len; i++) {
    for (let j = i + 1; j < len; j++) {
      if (arr[i] === arr[j]) {
        arr.splice(j, 1);
        // 每删除一个树,j--保证j的值经过自加后不变。同时,len--,减少循环次数提升性能
        len--;
        j--;
      }
    }
  }
  return arr;
}
console.log(unique1(arrs))

利用indexOf

var arrs=[1, 2, 3, 1, 3, '是是', '是是', '2', '测试', '服务', '测试', NaN, NaN, '服务', '服务'];  

const unique2 = arr => {
  const res = [];
  for (let i = 0; i < arr.length; i++) {
    if (res.indexOf(arr[i]) === -1) res.push(arr[i]);
  }
  return res;
}
console.log(unique2(arrs))

利用include

var arrs=[1, 2, 3, 1, 3, '是是', '是是', '2', '测试', '服务', '测试', NaN, NaN, '服务', '服务'];  

const unique3 = arr => {
  const res = [];
  for (let i = 0; i < arr.length; i++) {
    if (!res.includes(arr[i])) res.push(arr[i]);
  }
  return res;
}
console.log(unique3(arrs))

利用filter

var arrs=[1, 2, 3, 1, 3, '是是', '是是', '2', '测试', '服务', '测试', NaN, NaN, '服务', '服务'];  

const unique4 = arr => {
  return arr.filter((item, index) => {
    return arr.indexOf(item) === index;
  });
}
console.log(unique4(arrs))

利用Map

var arrs=[1, 2, 3, 1, 3, '是是', '是是', '2', '测试', '服务', '测试', NaN, NaN, '服务', '服务'];  

const unique5 = arr => {
  const map = new Map();
  const res = [];
  for (let i = 0; i < arr.length; i++) {
    if (!map.has(arr[i])) {
      map.set(arr[i], true)
      res.push(arr[i]);
    }
  }
  return res;
}
console.log(unique5(arrs))

 

 

 

 

 

 

 

 

 

 

### 数组对象的解决方案 在 JavaScript 中,对于数组内的对象进行的操作可以通过多种方法实现。以下是几种常见的解决思路及其具体实现。 #### 使用 `reduce` 和 `Map` 的组合 一种高效的方式是结合 `reduce` 方法和 `Map` 数据结构来完成对象数组操作。这种方法的核心在于利用 `Map` 来记录已经遍历过的键值对,从而避免复项被加入到最终的结果集中[^1]。 ```javascript const arr = [ { name: "ZDTX", gender: "AAAAAA.doc" }, { name: "ZYTA", gender: "BBBBBB.doc" }, { name: "ZDTX", gender: "CCCCCC.doc" } ]; const result = arr.reduce((acc, curr) => { if (!acc.map.has(curr.name)) { acc.array.push({ ...curr }); acc.map.set(curr.name, true); } return acc; }, { array: [], map: new Map() }).array; console.log(result); ``` 此代码片段展示了如何通过维护一个临时的 `Map` 实例来跟踪已存在的唯一键(这里是 `name` 属性),并仅当新遇到的对象未存在于该映射表中时才将其添加至累积器数组中。 #### 利用 `Set` 进行简单类型的 虽然单纯依靠 `Set` 不足以直接处理对象数组问题,因为其内部比较的是引用地址而非实际内容[^2],但我们仍然可以借助字符串化技术间接达成目的: ```javascript function uniqueObjects(array) { const seen = new Set(); return array.filter(item => { const stringifiedItem = JSON.stringify(item); if (seen.has(stringifiedItem)) { return false; } else { seen.add(stringifiedItem); return true; } }); } const filteredArray = uniqueObjects([ { id: 1, value: 'A' }, { id: 2, value: 'B' }, { id: 1, value: 'C' } ]); console.log(filteredArray); ``` 这里定义了一个辅助函数 `uniqueObjects` ,它接受任意形式的对象数组作为输入参数,并返回一个新的经过筛选后的无冗余版本的数据集合[^3]。 #### 自定义逻辑配合哈希表 另外还可以采用手动构建哈希表的形式来进行更灵活精确控制下的对象级联过滤过程: ```javascript var arr = [ {"name":"ZDTX","gender":"AAAAAA.doc"}, {"name":"ZYTA","gender":"BBBBBB.doc"}, {"name":"ZDTX","gender":"CCCCCC.doc"} ]; // 初始化一个空对象用于存储唯一的 key-value 组合关系 let hash = {}; let newArr = []; newArr = arr.reduce(function(acc,next){ // 如果当前元素的名字还没有出现在hash里,则把它放进结果集以及hash表当中 !hash[next['name']] && ( acc.push(next), hash[next['name']]=true ); return acc; },[]); console.log(newArr); ``` 这段脚本同样运用到了 reduce 高阶迭代工具,在每次循环过程中都会检查目标字段是否已经被登记过;如果没有的话就执行相应的追加动作[^3]。 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值