对于数组对象,根据指定的属性去重,并保留后一项

2024-04-30 11:20

本文主要是介绍对于数组对象,根据指定的属性去重,并保留后一项,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

所需要去重的数组

var arr = [{ name: 'a', id: 1 },{ name: 'a', id: 2 },{ name: 'b', id: 3 },{ name: 'c', id: 4 },{ name: 'c', id: 5 },{ name: 'b', id: 6 },{ name: 'd', id: 7 }
];// 输出结果
/*[{name:'a', id:2},{name:'c', id:5},{name:'b', id:6},{name:'d', id:7},]
*/

方式一:使用双层for循环可直接修改原数组

// 首先将数组反转,这样可以从后往前遍历
arr.reverse();for (var i = 0; i < arr.length - 1; i++) {for (var j = i + 1; j < arr.length; j++) {if (arr[i].name === arr[j].name) {// 删除重复的元素,保留后者arr.splice(j, 1);// 因为删除了一个元素,所以要 j--j--;}}
}// 循环结束后再次将数组反转,恢复原顺序
arr.reverse();console.log(arr);

方式二:增加一个新数组,配合ES6的every方法

const temp = [];
arr.reverse().forEach((item) => {// 数组的every方法,只有所有的数据都满足条件的时候才会返回true,否则就为falsevar check = temp.every((obj) => {return item.name !== obj.name;})// 如果新数组中没有该项的时候,就把该项填进去check ? temp.push(item) : ''
})
console.log(temp.reverse());//方法3:使用es6的Map()
let map = new Map();
for (let item of arr.reverse()) {if (!map.has(item.name)) {map.set(item.name, item);}
}
arr = [...map.values()]
console.log(arr.reverse());

方式三:使用ES6的map方法

let map = new Map();
for (let item of arr.reverse()) {if (!map.has(item.name)) {map.set(item.name, item);}
}
arr = [...map.values()]
console.log(arr.reverse());

方式四:使用ES5的reduce方法

var obj = {};
arr = arr.reverse().reduce((acculturate, current) => {obj[current.name] ? '' : obj[current.name] = true && acculturate.push(current);return acculturate;
}, [])
console.log(arr.reverse());

reduce( function (初始值或计算后返回值,当前元素,索引,原数组) {

        // 代码块

}, 函数初始值)

其中必选的有:

  •  初始值或计算后返回值
  • 当前元素

其中可选的有

  • 索引
  • 原数组
  • 函数初始值

这篇关于对于数组对象,根据指定的属性去重,并保留后一项的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/948736

相关文章

C++对象布局及多态实现探索之内存布局(整理的很多链接)

本文通过观察对象的内存布局,跟踪函数调用的汇编代码。分析了C++对象内存的布局情况,虚函数的执行方式,以及虚继承,等等 文章链接:http://dev.yesky.com/254/2191254.shtml      论C/C++函数间动态内存的传递 (2005-07-30)   当你涉及到C/C++的核心编程的时候,你会无止境地与内存管理打交道。 文章链接:http://dev.yesky

SQL Server中,用Restore DataBase把数据库还原到指定的路径

restore database 数据库名 from disk='备份文件路径' with move '数据库文件名' to '数据库文件放置路径', move '日志文件名' to '日志文件存放置路径' Go 如: restore database EaseWe from disk='H:\EaseWe.bak' with move 'Ease

API-环境对象

学习目标: 掌握环境对象 学习内容: 环境对象作用 环境对象: 指的是函数内部特殊的变量this,它代表着当前函数运行时所处的环境。 作用: 弄清楚this的指向,可以让我们代码更简洁。 函数的调用方式不同,this指代的对象也不同。【谁调用,this就是谁】是判断this指向的粗略规则。直接调用函数,其实相当于是window.函数,所以this指代window。

剑指offer(C++)--数组中只出现一次的数字

题目 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。 class Solution {public:void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) {int len = data.size();if(len<2)return;int one = 0;for(int i

Python分解多重列表对象,isinstance实现

“”“待打印的字符串列表:['ft','bt',['ad',['bm','dz','rc'],'mzd']]分析可知,该列表内既有字符对象,又有列表对象(Python允许列表对象不一致)现将所有字符依次打印并组成新的列表”“”a=['ft','bt',['ad',['bm','dz','rc'],'mzd']]x=[]def func(y):for i in y:if isinst

CALayer相关的属性

iOS开发UI篇—CAlayer层的属性 一、position和anchorPoint 1.简单介绍 CALayer有2个非常重要的属性:position和anchorPoint @property CGPoint position; 用来设置CALayer在父层中的位置 以父层的左上角为原点(0, 0)   @property CGPoint anchorPoint; 称为“定位点”、“锚点”

IOS 数组去重的几种方式

本来只知道NSSet和KeyValues的。今天又新学了几种方式 还有就是和同事学的一种方式 外层循环从0开始遍历,内层从最后一个元素开始遍历 for(int i=0;i<index;i++){  for(int j=index-1;j>i;j-- ){ } }

XMG xib中不属于一个类的控件,拖线到指定的类中

1.比如我现在有一个view绑定为GreenView,我们按住control向类里面拖线的方式想要达到目的,显然拖不进去。例图如下 那么我们此时还想要达到目的,就需要自己去GreenView的类内部去写IBo 然后这面连接起来 2.第二,大哥郝良建给做的扩展 可以在.h或者.m中写一个NSObject的属性 然后在xib中对应的位置创建一个NSObject的属性

MybatisPlus指定字段查询

一,上代码 QueryWrapper<Device> queryWrapper = Wrappers.query();queryWrapper.select("project_id as projectId,count(device_id) as total").in("project_id",projectIds).isNotNull("project_id").eq("del_flag",B

ORACLE 、达梦 数据库查询指定库指定表的索引信息

在Oracle数据库中,索引是一种关键的性能优化工具,通过它可以加快数据检索速度。在本文中,我们将深入探讨如何详细查询指定表的索引信息,以及如何利用系统视图和SQL查询来获取这些信息。 索引在数据库中的重要性 索引是一种数据结构,用于加快数据库表中数据的检索速度。它类似于书籍的目录,可以帮助数据库引擎快速定位数据行,特别是在大型数据集合下,其作用尤为显著。 查询指定表的索引信息 在Orac