为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

明月笑刀无情 2019-03-20 17:19:55
如下一个数组,怎么去除其中的重复对象,求大神给个方法,谢谢啊arr = [{orgId:"100",orgName:"信息组"},{orgId:"100",orgName:"信息组"},{orgId:"100",orgName:"信息组"},{orgId:"81",orgName:"安全组"},{orgId:"11",orgName:"秘书组"},{orgId:"81",orgName:"安全组"}]
查看完整描述

11 回答

?
慕桂英3389331

TA贡献2036条经验 获得超8个赞

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 处理


查看完整回答
反对 回复 2019-03-22
?
一只斗牛犬

TA贡献1784条经验 获得超2个赞

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

查看完整回答
反对 回复 2019-03-22
?
皈依舞

TA贡献1851条经验 获得超3个赞

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


查看完整回答
反对 回复 2019-03-22
?
慕妹3146593

TA贡献1820条经验 获得超9个赞


Array.prototype.removeRepeatAttr = function(){

    var tmp = {}, a = this.slice();

    for(var i = j = 0; i < a.length; i++){

        if(!tmp[a[i].orgId]){

            tmp[a[i].orgId] = !0;

            j++;

        }else{

            this.splice(j, 1);

        }

    };

}


var arr = [];

arr.removeRepeatAttr();


查看完整回答
反对 回复 2019-03-22
?
慕后森

TA贡献1802条经验 获得超5个赞

可以这样写


//将对象元素转换成字符串以作比较  

function obj2key(obj, keys){  

    var n = keys.length,  

        key = [];  

    while(n--){  

        key.push(obj[keys[n]]);  

    }  

    return key.join('|');  

}  

//去重操作  

function uniqeByKeys(array,keys){  

    var arr = [];  

    var hash = {};  

    for (var i = 0, j = array.length; i < j; i++) {  

        var k = obj2key(array[i], keys);  

        if (!(k in hash)) {  

            hash[k] = true;  

            arr .push(array[i]);  

        }  

    }  

    return arr ;  

}  

var array = [

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

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

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

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

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

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

]


//进行去重  

var arr = uniqeByKeys(array,['orgId','orgName']);  

斜体文字


查看完整回答
反对 回复 2019-03-22
?
汪汪一只猫

TA贡献1898条经验 获得超8个赞

可以了解下es6的set:


function dedupe(array){

 return Array.from(new Set(array));

}

dedupe([1,1,2,3]) //[1,2,3]


查看完整回答
反对 回复 2019-03-22
?
一只甜甜圈

TA贡献1836条经验 获得超5个赞

万能的 reduce


查看完整回答
反对 回复 2019-03-22
?
德玛西亚99

TA贡献1770条经验 获得超3个赞

以上答案都不支持排序混乱的情况下,且优化一下(避免用Object.values()再进行一次迭代),我补充下:


不改变目标数组

因为有创建数组并追加的行为,且无法result=Array(length)来让这行为提速,因此这种方式的效率会被给数组赋值所拖累。


let arr = [

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

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

        { orgId: '100', orgName: '01', a: 2 },

        { orgId: '01', orgName: '100', a: 2 },

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

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

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

    ];

let temp = {},

    result = [],

    idx = -1,

    unit;

arr.forEach( val => {

    unit = Object.keys( val ).map( key => [ key, val[ key ] ] ).sort() + '';

    temp[ unit ]

        || ( result[ ++idx ] = val, temp[ unit ] = 1 ) ;

} );

console.log( result );

改变目标数组

源数组长度越大,越突显性能


let temp = {},

    { length } = arr;


for ( let idx = 0; idx < length; idx++ ) {

    let val = arr[ idx ],

        unit = Object.keys( val ).map( key => [ key, val[ key ] ] ).sort() + '';

    temp[ unit ]

         ? ( arr.splice( idx, 1 ), idx--, length-- )

        : temp[ unit ] = 1

};

console.log( arr );


查看完整回答
反对 回复 2019-03-22
  • 11 回答
  • 0 关注
  • 1703 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信