【ES6】es6数组中对象去重,数组对象去重方法总结---filter()与reduce()实践

news/2024/7/10 23:31:00 标签: javascript, 前端, es6

es6数组中对象去重

  • 方法一: filter()与findIndex()给数组去重
    • 1. filter()用法
    • 2. findIndex()用法
    • 3. 去重实战
  • 方法二:reduce()去重
    • 1. reduce()用法
      • 1.1 找出字符长度最长的数组成员。
      • 1.2 扁平化二维数组
      • 1.3 扁平化多维数组
      • 1.4 数组去重
      • 1.5 对象内的属性求和
    • 2. 去重实战

开发中遇到搜索,数据是这样添加的this.delHumans.push(...humans); //将搜索出的人员添加到数据项
但是会遇到有重复的情况

方法一: filter()与findIndex()给数组去重

1. filter()用法

filter()方法返回一个包含符合指定条件的所有元素的新数组。如果没有符合条件的元素,则返回空数组。
注意: filter() 不会对空数组进行检测。
注意: filter() 不会改变原始数组。

javascript">let arr = [
		{id: 1,name: '张三'},
		{id: 2,name: '李四'}
	];

let nArr = arr.filter((currentValue, currentIndex, selfArr) =>{
    console.log(currentValue);
    console.log(currentIndex);
    console.log(selfArr);
});

打印结果:

{id: 1, name: '张三'}
0
[{id: 1, name: '张三'},{id: 2, name: '李四'}]

{id: 2, name: '李四'}
1
[{id: 1, name: '张三'},{id: 2, name: '李四'}]

2. findIndex()用法

findIndex()方法返回传入一个测试条件(函数)符合条件的数组第一个元素位置。
findIndex()方法为数组中的每个元素都调用一次函数执行:

  • 当数组中的元素在测试条件时返回 true 时, findIndex() 返回符合条件的元素的索引位置,之后的值不会再调用执行函数。
  • 如果没有符合条件的元素返回 -1

注意: findIndex() 对于空数组,函数是不会执行的。
注意: findIndex() 并没有改变数组的原始值。

javascript">[3, 10, 18, 20].findIndex(value => value>11);  // 2 (18的下标是2)
[3, 10, 18, 20].findIndex(value => value>1);  // 0 (3的下标是0)
[3, 10, 18, 20].findIndex(value => value>30); // -1 (不存在则返回-1)

3. 去重实战

javascript">let arr = [
		{id: 1,name: '张三'},
		{id: 2,name: '李四'},
		{id: 1,name: '张三'},
		{id: 2,name: '李四'}
	];

let nArr = arr.filter((currentValue, currentIndex, selfArr) = >{
	return selfArr.findIndex(x = >x.name === currentValue.name) === currentIndex
});
console.log(nArr);

结果:

[{"id": 1,"name": "张三"},{"id": 2,"name": "李四"}]

其他方法:

var m = new Map();
person = person.filter((ele) => !m.has(ele.id) && m.set(ele.id, ""));

方法二:reduce()去重

1. reduce()用法

reduce方法和reduceRight方法依次处理数组的每个成员,最终累计为一个值。

区别:
reduce是从左到右处理(从第一个成员到最后一个成员),
reduceRight则是从右到左(从最后一个成员到第一个成员),其他完全一样。

注意:
reduce() 对于空数组是不会执行回调函数的。

语法:
array.reduce(function(total, currentValue, currentIndex, arr), initialValue)

  • total 累积变量,默认为数组的第一个成员
  • currentValue 当前变量,默认为数组的第二个成员
  • currentIndex 当前位置(从0开始)
  • arr 原数组
    这四个参数之中,只有前两个是必须的,后两个则是可选的。
javascript">// total为最终累计值
let total = [1, 2, 3, 4, 5].reduce(function (a, b) {
  console.log(a, b);
  return a + b;
});
// 1 2
// 3 3
// 6 4
// 10 5
// 15

如果要对累积变量指定初值,可以把它放在reduce方法和reduceRight方法的第二个参数。

javascript">[1, 2, 3, 4, 5].reduce(function (a, b) {
  return a + b;
}, 10);
// 25

上面的第二个参数相当于设定了默认值,处理空数组时尤其有用,可避免一些空指针异常。

由于这两个方法会遍历数组,所以实际上还可以用来做一些遍历相关的操作。
比如,

1.1 找出字符长度最长的数组成员。

javascript">function findLongest(entries) {
  return entries.reduce(function (longest, entry) {
    return entry.length > longest.length ? entry : longest;
  }, '');
}
 
findLongest(['aaa', 'bb', 'c']) // "aaa"

上面代码中,reduce的参数函数会将字符长度较长的那个数组成员,作为累积值。这导致遍历所有成员之后,累积值就是字符长度最长的那个成员。

1.2 扁平化二维数组

javascript">let arr = [[0, 1], [2, 3], [4, 5]]
let newArr = arr.reduce((pre,cur)=>{
    return pre.concat(cur)
},[])
console.log(newArr); // [0, 1, 2, 3, 4, 5]

1.3 扁平化多维数组

javascript">let arr = [[0, 1], [2, 3], [4,[5,6,7]]]
const newArr = function(arr){
   return arr.reduce((pre,cur)=>pre.concat(Array.isArray(cur)?newArr(cur):cur),[])
}
console.log(newArr(arr)); //[0, 1, 2, 3, 4, 5, 6, 7]

1.4 数组去重

javascript">let arr = [1, 2, 2, 4, null, null].reduce((accumulator, current) => {
    return accumulator.includes(current) ? accumulator : accumulator.concat(current);
}, []);
javascript">let arr = [1, 2, 2, 4, null, null].filter((item, index, arr) => arr.indexOf(item) === index); // [1,2,4,null]
javascript">let arr = [...new Set([1, 2, 2, 4, null, null])]; // [1,2,4,null]

1.5 对象内的属性求和

javascript">var result = [
    {
        subject: 'math',
        score: 10
    },
    {
        subject: 'chinese',
        score: 20
    },
    {
        subject: 'english',
        score: 30
    }
];

var sum = result.reduce(function(prev, cur) {
    return cur.score + prev;
}, 0);
console.log(sum) //60

2. 去重实战

利用reduce()方法的累积器作用,在对由对象组成的数组进行遍历时,通过对象hasObj来标记数组中每个元素id是否出现过。
如果出现过,那么遍历到的当前元素则不会放入到累积器中,
如果没有出现,则添加到累积器中,这样保证了最后返回值中每个数据id的唯一性。

javascript">let person = [
     {id: 0, name: "小明"},
     {id: 1, name: "小张"},
     {id: 2, name: "小李"},
     {id: 3, name: "小孙"},
     {id: 1, name: "小周"},
     {id: 2, name: "小陈"},   
];

let hasObj= {};

person = person.reduce((cur,next) => {
	// true && cur.push(next)惰性求值?--如果最后一个表达式为非false,那么直接返回这个表达式的结果,反之直接是false
    hasObj[next.id] ? "" : (hasObj[next.id] = true && cur.push(next)); 
    return cur;
},[]) //设置cur默认类型为数组,并且初始值为空的数组
console.log(person);
[{"id": 0,"name": "小明"},
 {"id": 1,"name": "小张"},
 {"id": 2,"name": "小李"},
 {"id": 3,"name": "小孙"}]

http://www.niftyadmin.cn/n/736305.html

相关文章

axios学习总结

最近在做一个vue项目用到了axios的插件,axios通俗的说就是jQuery中的ajax,只是jQuery太重了,所以其中的ajax功能被剥离出来了。下面稍微总结一下: axios基本用法 vue更新到2.0之后,作者就宣告不再对vue-resource更新&a…

【前端】常见英文缩写汇总、解析(持续更新...)

常见英文缩写汇总(持续更新...)1. Aasync3. CcamelCaseCLI8. HHMR11. K14. Nnpm16. PpropsProxy19.SSFCSPASSOT20. Rrefs21. S22. Ttsc23. WWDS1. A async async表示asynchronous异步的 3. C camelCase camelCase骆驼拼写法,“骆驼拼写法…

JavaScript 中的对象拷贝总结

对象是 JavaScript 的基本块。对象是属性的集合,属性是键值对。JavaScript 中的几乎所有对象都是位于原型链顶部 Object 的实例。 介绍 如你所知,赋值运算符不会创建一个对象的副本,它只分配一个引用,我们来看下面的代码&#xf…

【Vue】vue2.6使用TS之vue-class-component与vue-property-decorator使用详解

vue2.6中对typescript的支持 Vue CLI 3 可以使用 TypeScript 生成新工程。 # 1. 如果没有安装 Vue CLI 就先安装 cnpm install --global vue/cli# 2. 创建一个新工程,并选择 "Manually select features (手动选择特性)" 选项 vue create my-project-name…

【优化】前端性能优化---计算首屏加载时间和首屏加载速度慢怎么解决?

SPA单页面应用:计算首屏加载时间和首屏加载速度慢怎么解决?1. 什么是首屏加载时间?2. 首屏加载速度慢怎么解决?2.1 减少入口文件体积2.2 静态资源本地缓存2.3 UI框架按需加载2.4 避免组件重复打包2.5 图片资源压缩2.6 开启gzip压缩1. 什么是…

【vscode】vscode下载速度慢,国内下载vscode速度慢问题解决

vscode官网下载地址—https://code.visualstudio.com/ 首先在官网找到需要下载的文件,点击下载。 在浏览器或者下载软件中就可以看到这么一个下载地址了,将下方红框的地址换成vscode.cdn.azure.cn 即在浏览器导航栏输入以下地址: https:/…

在ajax中如何把局部变量变为全局变量

今天在做一个项目时,遇到了一个问题。我用的是ajax,要在$.ajax({})里面给一个全局变量赋值,结果死活赋值不上,(就是给变量赋值是,外部始终拿不到该值,即无法当成全局变量)纠结了好半…

Openlayers 快速上手教程

📢欢迎点赞👍/ 收藏⭐/ 留言📝如有错误敬请指正! 1. Openlayers简介 Openlayers 是开源的前端地图框架,官网地址:https://openlayers.org/ 它的作用主要是用于展现数据并且提供相应的地图操作工具。 1.1 …