猿问

有没有数组中对象去重的办法?

如下一个数组,怎么去除其中的重复对象,求大神给个方法,谢谢啊


arr = [

{orgId:"100",orgName:"信息组"},

{orgId:"100",orgName:"信息组"},

{orgId:"100",orgName:"信息组"},

{orgId:"81",orgName:"安全组"},

{orgId:"11",orgName:"秘书组"},

{orgId:"81",orgName:"安全组"}

]


明月笑刀无情
浏览 1704回答 11
11回答

慕桂英3389331

var arr = [  { orgId: '100', orgName: '信息组' },  { orgId: '100', orgName: '信息组' },  { orgId: '100', orgName: '信息组' },  { orgId: '81', orgName: '安全组' },  { orgId: '11', orgName: '秘书组' },  { orgId: '81', orgName: '安全组' },];Object.values(  arr.reduce((obj, next) => {    var key = JSON.stringify(next);    return (obj[key] = next), obj;  }, {}),);我来个最简单的,but 有个缺点,arr里面的对象必须能被 JSON.stringify 处理

一只斗牛犬

stringify那位兄弟的去重方法是可以的(之前说稳健是不对的,还不够稳健)。不过代码也是要考虑实际业务场景的,这样的数组数据是怎么来的呢?orgId是不是已经就是有着 唯一Id 的作用的,是不是 orgId 一致的对象,就代表着对象是一致的。如果是的话,那就没必要stringify了,直接拿orgId当key去重就好了

皈依舞

这个自己思考下啊,动动手,遍历一下数组,然后把没有出现的元素放到一个新数组返回啊

慕妹3146593

Array.prototype.removeRepeatAttr = function(){&nbsp; &nbsp; var tmp = {}, a = this.slice();&nbsp; &nbsp; for(var i = j = 0; i < a.length; i++){&nbsp; &nbsp; &nbsp; &nbsp; if(!tmp[a[i].orgId]){&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; tmp[a[i].orgId] = !0;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; j++;&nbsp; &nbsp; &nbsp; &nbsp; }else{&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this.splice(j, 1);&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; };}var arr = [];arr.removeRepeatAttr();

慕后森

可以这样写//将对象元素转换成字符串以作比较&nbsp;&nbsp;function obj2key(obj, keys){&nbsp;&nbsp;&nbsp; &nbsp; var n = keys.length,&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; key = [];&nbsp;&nbsp;&nbsp; &nbsp; while(n--){&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; key.push(obj[keys[n]]);&nbsp;&nbsp;&nbsp; &nbsp; }&nbsp;&nbsp;&nbsp; &nbsp; return key.join('|');&nbsp;&nbsp;}&nbsp;&nbsp;//去重操作&nbsp;&nbsp;function uniqeByKeys(array,keys){&nbsp;&nbsp;&nbsp; &nbsp; var arr = [];&nbsp;&nbsp;&nbsp; &nbsp; var hash = {};&nbsp;&nbsp;&nbsp; &nbsp; for (var i = 0, j = array.length; i < j; i++) {&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; var k = obj2key(array[i], keys);&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; if (!(k in hash)) {&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; hash[k] = true;&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; arr .push(array[i]);&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp;&nbsp;&nbsp; &nbsp; }&nbsp;&nbsp;&nbsp; &nbsp; return arr ;&nbsp;&nbsp;}&nbsp;&nbsp;var array = [{orgId:"100",orgName:"信息组"},{orgId:"100",orgName:"信息组"},{orgId:"100",orgName:"信息组"},{orgId:"81",orgName:"安全组"},{orgId:"11",orgName:"秘书组"},{orgId:"81",orgName:"安全组"}]//进行去重&nbsp;&nbsp;var arr = uniqeByKeys(array,['orgId','orgName']);&nbsp;&nbsp;斜体文字

汪汪一只猫

可以了解下es6的set:function dedupe(array){&nbsp;return Array.from(new Set(array));}dedupe([1,1,2,3]) //[1,2,3]

一只甜甜圈

万能的&nbsp;reduce

德玛西亚99

以上答案都不支持排序混乱的情况下,且优化一下(避免用Object.values()再进行一次迭代),我补充下:不改变目标数组因为有创建数组并追加的行为,且无法result=Array(length)来让这行为提速,因此这种方式的效率会被给数组赋值所拖累。let arr = [&nbsp; &nbsp; &nbsp; &nbsp; { orgId: '100', orgName: '信息组' },&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; orgName: '信息组', orgId: '100' },&nbsp; &nbsp; &nbsp; &nbsp; { orgId: '100', orgName: '01', a: 2 },&nbsp; &nbsp; &nbsp; &nbsp; { orgId: '01', orgName: '100', a: 2 },&nbsp; &nbsp; &nbsp; &nbsp; { orgId: '81', orgName: '安全组' },&nbsp; &nbsp; &nbsp; &nbsp; { orgId: '11', orgName: '秘书组' },&nbsp; &nbsp; &nbsp; &nbsp; { orgId: '81', orgName: '安全组' },&nbsp; &nbsp; ];let temp = {},&nbsp; &nbsp; result = [],&nbsp; &nbsp; idx = -1,&nbsp; &nbsp; unit;arr.forEach( val => {&nbsp; &nbsp; unit = Object.keys( val ).map( key => [ key, val[ key ] ] ).sort() + '';&nbsp; &nbsp; temp[ unit ]&nbsp; &nbsp; &nbsp; &nbsp; || ( result[ ++idx ] = val, temp[ unit ] = 1 ) ;} );console.log( result );改变目标数组源数组长度越大,越突显性能let temp = {},&nbsp; &nbsp; { length } = arr;for ( let idx = 0; idx < length; idx++ ) {&nbsp; &nbsp; let val = arr[ idx ],&nbsp; &nbsp; &nbsp; &nbsp; unit = Object.keys( val ).map( key => [ key, val[ key ] ] ).sort() + '';&nbsp; &nbsp; temp[ unit ]&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;? ( arr.splice( idx, 1 ), idx--, length-- )&nbsp; &nbsp; &nbsp; &nbsp; : temp[ unit ] = 1};console.log( arr );
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答