JS 数组去重(含简单数组去重【5种方法】、对象数组去重【2种方法】)

简介: JS 数组去重(含简单数组去重【5种方法】、对象数组去重【2种方法】)

简单数组去重

简单数组:由基础数据类型元素组成的数组,如 [1,‘你好’,true]

方法一 : 利用Set去重

利用 Set 数据结构自动去重的特征实现

let oldList = [1, 2, 3, 3];
let newList = Array.from(new Set(oldList)); // 得到 [1, 2, 3]

类似写法如下:

function arrDistinct(arr){
    const newArr = new Set(arr);
    return [...newArr]
}

let list = [1,2,2,3,4,4]
console.log(arrDistinct(list))

方法二 : 嵌套循环,自己与自己对比,有重复则删掉

let arr = [1, 2, 3, 2, 2, 1, 3, 4, 2, 5];

//去除数组中重复的数字
for (let i = 0; i < arr.length; i++) {
  /*获取当前元素后的所有元素*/
  for (let j = i + 1; j < arr.length; j++) {
    //判断两个元素的值是否相等
    if (arr[i] == arr[j]) {
      //如果相等则证明出现了重复的元素,则删除j对应的元素
      arr.splice(j, 1);
      //当删除了当前j所在的元素以后,后边的元素会自动补位
      //使j自减,再比较一次j所在位置的元素
      j--;
    }
  }
}

console.log(arr); // 结果为 [ 1, 2, 3, 4, 5 ]

方法三 : 将不重复的元素放入新数组

//思路:创建一个新数组,循环遍历,只要新数组中有老数组的值,就不用再添加了。
function arrDistinct(array) {
  let newArr = [];
  for (let i = 0; i < array.length; i++) {
    //开闭原则
    let bool = true;
    //每次都要判断新数组中是否有旧数组中的值。
    for (let j = 0; j < newArr.length; j++) {
      if (array[i] === newArr[j]) {
        bool = false;
      }
    }
    if (bool) {
      newArr[newArr.length] = array[i];
    }
  }
  return newArr;
}

let oldList = [1, 2, 3, 4, 5, 2, 3, 4];

let newList = arrDistinct(oldList);

console.log(newList); // 结果 [ 1, 2, 3, 4, 5 ]

方法四 : 使用 reduce

let arr = [1,2,3,4,4,1]
let newArr = arr.reduce((pre,cur)=>{
    if(!pre.includes(cur)){
      return pre.concat(cur)
    }else{
      return pre
    }
},[])
console.log(newArr);// [1, 2, 3, 4]

方法五 : 使用 lodash 的 uniq()

_.uniq([2, 1, 2]);  // => [2, 1]

对象数组去重

对象数组:由对象组成的数组

function arrDistinctByProp(arr,prop){
    //只返回第一次出现的,重复出现的过滤掉
    return arr.filter(function(item,index,self){
        return self.findIndex(el=>el[prop]==item[prop])===index
    })
}

let list = [
    {
        key:'1',
        name:'林青霞'
    },
    {
        key:'2',
        name:'张三丰'
    },
    {
        key:'1',
        name:'段誉'
    },
    {
        key:'1',
        name:'段誉'
    }
]
 
//通过name属性去重
console.log(arrDistinctByProp(list,'name'))

另一种可能更容易理解,写法如下:

function soloArray(array, UID) {
  let newArr = [];
  let UIDlist = [];

  array.forEach((item) => {
    if (!UIDlist.includes(item[UID])) {
      UIDlist.push(item[UID]);
      newArr.push(item);
    }
  });
  return newArr;
}

let oldList = [
  {
    ID: 1,
    name: "王小虎",
    age: 10,
  },
  {
    ID: 2,
    name: "张三",
    age: 20,
  },
  {
    ID: 2,
    name: "张三",
    age: 20,
  },
  {
    ID: 3,
    name: "李四",
    age: 30,
  },
];

let newList = soloArray(oldList, "ID");
console.log(newList);
目录
相关文章
|
2月前
|
JavaScript 前端开发
如何在 JavaScript 中使用 __proto__ 实现对象的继承?
使用`__proto__`实现对象继承时需要注意原型链的完整性和属性方法的正确继承,避免出现意外的行为和错误。同时,在现代JavaScript中,也可以使用`class`和`extends`关键字来实现更简洁和直观的继承语法,但理解基于`__proto__`的继承方式对于深入理解JavaScript的面向对象编程和原型链机制仍然具有重要意义。
|
2月前
|
JavaScript 前端开发 程序员
前端原生Js批量修改页面元素属性的2个方法
原生 Js 的 getElementsByClassName 和 querySelectorAll 都能获取批量的页面元素,但是它们之间有些细微的差别,稍不注意,就很容易弄错!
|
5天前
|
JavaScript 前端开发 开发者
JavaScript字符串的常用方法
在JavaScript中,字符串处理是一个非常常见的任务。JavaScript提供了丰富的字符串操作方法,使开发者能够高效地处理和操作字符串。本文将详细介绍JavaScript字符串的常用方法,并提供示例代码以便更好地理解和应用这些方法。
34 13
|
2月前
|
监控 JavaScript Java
Node.js中内存泄漏的检测方法
检测内存泄漏需要综合运用多种方法,并结合实际的应用场景和代码特点进行分析。及时发现和解决内存泄漏问题,可以提高应用的稳定性和性能,避免潜在的风险和故障。同时,不断学习和掌握内存管理的知识,也是有效预防内存泄漏的重要途径。
173 52
|
2月前
|
JSON 前端开发 JavaScript
JavaScript中对象的数据拷贝
本文介绍了JavaScript中对象数据拷贝的问题及解决方案。作者首先解释了对象赋值时地址共享导致的值同步变化现象,随后提供了五种解决方法:手动复制、`Object.assign`、扩展运算符、`JSON.stringify`与`JSON.parse`组合以及自定义深拷贝函数。每种方法都有其适用场景和局限性,文章最后鼓励读者关注作者以获取更多前端知识分享。
30 1
JavaScript中对象的数据拷贝
|
2月前
|
缓存 JavaScript 前端开发
JavaScript 与 DOM 交互的基础及进阶技巧,涵盖 DOM 获取、修改、创建、删除元素的方法,事件处理,性能优化及与其他前端技术的结合,助你构建动态交互的网页应用
本文深入讲解了 JavaScript 与 DOM 交互的基础及进阶技巧,涵盖 DOM 获取、修改、创建、删除元素的方法,事件处理,性能优化及与其他前端技术的结合,助你构建动态交互的网页应用。
61 5
|
2月前
|
JavaScript 前端开发
js中的bind,call,apply方法的区别以及用法
JavaScript中,`bind`、`call`和`apply`均可改变函数的`this`指向并传递参数。其中,`bind`返回一个新函数,不立即执行;`call`和`apply`则立即执行,且`apply`的参数以数组形式传递。三者在改变`this`指向及传参上功能相似,但在执行时机和参数传递方式上有所区别。
34 1
|
8月前
|
JavaScript 前端开发
JS将两个数组和合并成数组包对象格式的方法
JS将两个数组和合并成数组包对象格式的方法
112 0
|
5月前
|
JavaScript 前端开发 索引
JS遍历数组里数组下的对象,根据数组中对象的某些值,组合成新的数组对象
这篇文章介绍了如何在JavaScript中遍历数组里数组下的对象,并根据对象的某些属性值组合成一个新的数组对象。主要内容包括使用ES6的`for...of`循环来遍历数组对象,然后根据需要提取对象中的属性值,并将它们放入新的对象中,最终形成一个新的对象数组以供使用。
|
3月前
|
缓存 JavaScript 前端开发
JavaScript中数组、对象等循环遍历的常用方法介绍(二)
JavaScript中数组、对象等循环遍历的常用方法介绍(二)
58 1
下一篇
开通oss服务