前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >数组对象根据对象中指定的属性去重?你知道多少

数组对象根据对象中指定的属性去重?你知道多少

作者头像
sunseekers
发布于 2018-10-31 08:44:59
发布于 2018-10-31 08:44:59
2.9K00
代码可运行
举报
运行总次数:0
代码可运行

有一天有一个朋友给我发来消息 “数组对象根据对象中指定的属性去重?让我写写看”,看到这个的时候我有点懵逼,好像不太会。

我只能咬着牙硬着头皮死磕,差点从入门到放弃,在朋友一步一步指导下面终于写好了,朋友总结好了发了我一份,本着自愿共享的精神。过来两天我就把这个给忘了

在项目中刚好遇到这个东西,那时候脑子仅剩一点点的思路,努力回想时却早已记忆模糊。很无奈呀,怎么办?项目开发需要,硬着头皮又找朋友要了一份哈哈。现在我决定我要建立一个自己的 js 小仓库,里面就放我不懂的,有事没事去翻翻,温故

喜欢和朋友交流,偶尔会抛一些技术问题给我,我不会,每次都在指导下慢慢的一步一步明白懂了,顺便学到了新知识。哈哈一起学习进步,欢迎技术交流

问题:数组对象根据对象中指定的属性去重?

方法一: reduce 方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function unique(arr,u_key){
  let obj = {}
  arr.reduce((prev,next)=>{
    obj[next[u_key]+typeof next[u_key]] ?  '' :
    obj[next[u_key]+typeof next[u_key]] = true && prev.push(next)
    return prev 
  },[])
}
复制代码

push 方法是返回新数组的长度,&& 返回的是后面那个值,而我们需要的是一个第一次执行的数组对象,所以另写了一行 return prev

方法二: 计数器原理

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function unique(arr,u_key){
  let result = []
  result[0] = arr[0]
  arr.forEach((meta_item,i)=>{
    //声明计数变量,如果源数组中的一个对象和result结果数组中的所有对象不同,就push
    let num = 0
    result.forEach((r_item,j)=>{
      if (meta_item[u_key]!==r_item[u_key]) {
        num++
      }
      if (num === result.length) {
        result.push(meta_item)
      }
    })
  })
  return result
}
复制代码

方法三 : 简单粗暴循环,利用原理是对象的同名属性会被覆盖(和第一种方法有点像)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function unique(arr,u_key) {
  let obj = {}
  let result = []
  arr.forEach(item=>{
    let typeof_key = typeof item[u_key] + item[u_key]
    obj[typeof_key] = item
  })
  for (let key in obj) {
    result.push(obj[key])
  }
  return result
}
复制代码

方法四:ES6Map

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function unique(arr,u_key) {
  let map = new Map()
  arr.forEach((item,index)=>{
    if (!map.has(item[u_key])){
      map.set(item[u_key],item)
    }
  })
  return [...map.values()]
}
复制代码

这个方法是我 Java 同事看了我掘金以后给出的答案,或许这就是大佬吧,对于 ES6mapset,我只知道有这个东西,未曾深入了解过。自愧不如,JavaES6 玩的比我还好,我要一头扎入学习的海洋,到达他的高度 测试案例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let arrayList = [{
  id:'1',
  name:'one'
},{
  id:'2',
  name:'tow',
},{
  id:'3',
  name:'three'
},{
  id:'1',
  name:'one'
},{
  id:2,
  name:'tow',
},{
  id:'3',
  name:'three'
}]
unique(arrayList,'id')
复制代码

来自萌新的瑟瑟发抖,如有不对之处,希望可以指出,如果有其他的更好的方法,期待可以学习交流

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018年10月18日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
十个常用的工具函数​
ES6 的数组中提供了 flat 函数。这个函数是 Array.prototype 上的一个函数。而且可以指定要提取嵌套数组的结构深度,默认值为 1。
多云转晴
2019/10/23
1.1K0
分享6个对象数组去重的方法
使用 filter() 方法过滤掉重复的元素,使用 findIndex() 方法判断对象是否重复,代码如下:
前端达人
2023/02/17
4.3K0
分享6个对象数组去重的方法
javascript数组去重set方法_js数组去重api
这是最简单的数组去重方法,实现思路:新建一新数组,传入要去重的数组,遍历该数组,若值不在新数组中则加入该数组;需要注意点:判断值是否在数组的方法“indexOf”是ECMAScript5 方法,IE8以下不支持,示例如下:
全栈程序员站长
2022/08/04
2.7K0
2022前端面试遇到的手写题总结
下面来看一道比较典型的问题,通过这个问题来对比几种异步编程方法:红灯 3s 亮一次,绿灯 1s 亮一次,黄灯 2s 亮一次;如何让三个灯不断交替重复亮灯?
helloworld1024
2022/09/22
7180
收藏好了,JS开发须知道的41个小技巧
链接:https://juejin.im/post/6854573212890562573
coder_koala
2020/11/10
5670
收藏好了,JS开发须知道的41个小技巧
9种JS数组去重的高阶方法思路,值得借鉴
一般的方法此处也不列举了,还是有很多的,如双层循环判断是否相等,或新建数组比较再push等等,需要注意的是,使用splice方法移除元素时,有可能会导致数组塌陷问题,需要处理一下。
前端达人
2021/06/16
8920
手撕前端面试代码题大全
加入我们一起学习,天天进步 转载自:等不到你. https://blog.csdn.net/weixin_43758603/article/details/109895826 写在前面 最近我终于找到
coder_koala
2020/12/17
1.3K0
手撕前端面试代码题大全
数组去重
思路:利用两个for循环.遍历数组中的每一项,对每一项又遍历这项后面的每一项。也就是将当前元素与他后面的所有元素作比较,只要碰到与当前元素相等的情况,利用j = ++i重新开始外层大循环。直到其后面没有重复的元素就push进新数组
一觉睡到小时候
2019/07/03
3.2K0
自定义工具函数库(二) 数组相关
循环,数组的每个元素都调用一次函数,并把每次循环得到的返回值都存好,循环结束后,把存好的数组返回。
赤蓝紫
2023/03/11
5920
js常见功能函数
3、isObject:判断数据是不是引用类型的数据 (例如: arrays, functions, objects, regexes, new Number(0),以及 new String(''))
前端_AWhile
2019/09/16
2.8K0
盘盘项目中你常用到的数组API
数组在业务中是一个非常高频的API,在业务中基本都有用它,必不可少,本文是笔者一篇关于数组常用API的总结,希望看完在项目中有所帮助。
Maic
2022/12/21
5720
盘盘项目中你常用到的数组API
「面试」45 道牛客网 JavaScript 经典题总结(8500字)
牛客网的45道JS能力评测题个人觉得是非常好的45道js基础检测题,基本就是对自己的JavaScript基础做一个比较全面的评估,包括if语句、循环体、基础操作符、setInterval、setTimeout、流程控制、常用数组方法及es6相关(解构、Map、Set、...等)。之前我已经做过一遍了,我记得以前牛客网不支持es6的写法,这两天花了点时间把所有题目又做了一遍,发现支持es6了。这次每个题目我都尽力用了不同的方法实现,建议各位看官收藏,需要的时候方便查看。当然如果你有更好更新颖的实现方法,欢迎评论区留言交流。
coder_koala
2020/07/15
1.1K0
「面试」45 道牛客网 JavaScript 经典题总结(8500字)
JS手撕(一)    类型判断、instanceof、数组去重
有用过JS一段时间的小伙伴应该对typeof比较属性,我们需要进行类型判断的时候一般都会先想到它。但是呢,它有一个很大的局限性,比如如果是null、array都会被认为是object,array是因为是一个特殊的对象,而null则是因为JS诞生以来null的实现导致的。
赤蓝紫
2023/03/16
1.8K0
JS实现JSON数组合并和去重
上面已经得到合并的数组 totalDemo ,去掉name属性是一样的json对象
别盯着我的名字看
2022/06/09
2.5K0
前端面试遇到了这些手写题
原理就是监听页面滚动事件,分析clientHeight、scrollTop、scrollHeight三者的属性关系。
helloworld1024
2022/09/23
4250
最全的JS数组去重
数组去重,一般都是在面试的时候才会碰到,一般是要求手写数组去重方法的代码。如果是被提问到,数组去重的方法有哪些?你能答出其中的10种,面试官很有可能对你刮目相看。在真实的项目中碰到的数组去重,一般都是后台去处理,很少让前端处理数组去重。虽然日常项目用到的概率比较低,但还是需要了解一下,以防面试的时候可能回被问到。文末有福利哦
grain先森
2019/03/28
2K0
高级前端常考手写面试题合集5
方法有很多种,这里提供一种比较简洁的写法,用到了ES10的Object.fromEntries():
helloworld1024
2023/01/09
5010
数组对象去重
在本博客中的表格中就有用到的,对于很多相同的标签,需要对标签进行过滤,把相同的给去掉
itclanCoder
2021/12/20
1.5K0
数组对象去重
2022必会的前端手写面试题
要求写出 区号+8位数字,或者区号+特殊号码: 10010/110,中间用短横线隔开的正则验证。 区号就是三位数字开头。
buchila11
2022/05/01
7810
滴滴前端一面高频手写面试题汇总_2023-02-28
浅拷贝是指,一个新的对象对原始对象的属性值进行精确地拷贝,如果拷贝的是基本数据类型,拷贝的就是基本数据类型的值,如果是引用数据类型,拷贝的就是内存地址。如果其中一个对象的引用内存地址发生改变,另一个对象也会发生变化。
用户10358576
2023/02/28
7460
相关推荐
十个常用的工具函数​
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验