假设现在有一个对象数组
arr=[
{
id:1,
content:'a'
},{
id:2,
content:'b'
},{
id:2,
content:'c'
},{
id:3,
content:'d'
},{
id:3,
content:'e'
},{
id:3,
content:'f'
},{
id:3,
content:'g'
},{
id:4,
content:'h'
},
]
我想去掉相同的id 然后保留各个id的最后一项
arr=[
{
id:1,
content:'a'
},{
id:2,
content:'c'
},{
id:3,
content:'g'
},{
id:4,
content:'h'
},
]
有什么好一点的方法嘛。。
按惯例,ES6 代码
这里有一个问题,
findIndex
至少有两个浏览器不支持,所以,如果不支持的话,只好自己写一个其它解法
经典解决,用 Map
因为 id 不是字符串,所以使用 ES6 的
Map
类。当数据量大的时候,使用查找表,比在列表中线性查找,效率会有显着的提升。其实也可以用对象来代替 map,至少在这个用例中不会有问题。因为没用 es6 特性,索性完全使用 es5 语法。代码结构和逻辑与上面那段一样
怪异解法,利用整数 id
因为是整数 id,所以可以直接按这个 id 放在数组中。如果遇到相同 id,直接就替换了。如果 id 不连续,最后需要把空元素过滤掉
这种解法还有个问题,不能保持原数组的元素顺序。然后肯定会有人想到,用 Map 的那个解法也可以把代码精减成类似的代码,而不需要搞那么复杂,当然它也同样可能失去原有顺序
使用箭头函数简化如下:
这里面已经有很多答案了,不过没有提到Array的内置函数reduceRight,实际上题主的需求,要求保留相同id的最后一位,用reduceRight实现起来很方便。
reduceRight从你原数组尾部开始循环的,我这里的初始值是个数组,r[0]用来存放id的Set,r[1]存放结果数组,如果Set里没有id,那么就添加这个id到Set,并且把这一项放在结果数组的头部。
最终很容易的实现了题主的需求,而且顺序也能保证。
亲测有效
雷雷
让 newArr = [],
雷雷雷雷
参考一下
你可以参考我博客写的,我博客上写了8中方法。http://alfierichou.top/2017/0...