鍍金池/ 問(wèn)答/HTML/ 數(shù)組中對(duì)象去重的方法

數(shù)組中對(duì)象去重的方法

如下一個(gè)數(shù)組,怎么去除其中的重復(fù)對(duì)象,求大神給個(gè)方法,謝謝啊

arr = [
{orgId:"100",orgName:"信息組"},
{orgId:"100",orgName:"信息組"},
{orgId:"100",orgName:"信息組"},
{orgId:"81",orgName:"安全組"},
{orgId:"11",orgName:"秘書組"},
{orgId:"81",orgName:"安全組"}
]
回答
編輯回答
膽怯

stringify那位兄弟的去重方法是可以的(之前說(shuō)穩(wěn)健是不對(duì)的,還不夠穩(wěn)?。?。
不過(guò)代碼也是要考慮實(shí)際業(yè)務(wù)場(chǎng)景的,這樣的數(shù)組數(shù)據(jù)是怎么來(lái)的呢?
orgId是不是已經(jīng)就是有著 唯一Id 的作用的,是不是 orgId 一致的對(duì)象,就代表著對(duì)象是一致的。如果是的話,那就沒必要stringify了,直接拿orgId當(dāng)key去重就好了

2018年6月23日 18:56
編輯回答
失魂人

Unique啊。
去重(zhong)的話呢,你懂的

2018年5月1日 21:42
編輯回答
凹凸曼

萬(wàn)能的 reduce

2018年1月31日 07:57
編輯回答
撿肥皂

以上答案都不支持排序混亂的情況下,且優(yōu)化一下(避免用Object.values()再進(jìn)行一次迭代),我補(bǔ)充下:

不改變目標(biāo)數(shù)組
因?yàn)橛袆?chuàng)建數(shù)組并追加的行為,且無(wú)法result=Array(length)來(lái)讓這行為提速,因此這種方式的效率會(huì)被給數(shù)組賦值所拖累。

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 );

改變目標(biāo)數(shù)組
源數(shù)組長(zhǎng)度越大,越突顯性能

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 );
2017年8月19日 13:06
編輯回答
扯機(jī)薄

可以了解下es6的set:

function dedupe(array){
 return Array.from(new Set(array));
}
dedupe([1,1,2,3]) //[1,2,3]
2017年4月25日 12:34
編輯回答
涼心人

可以這樣寫

//將對(duì)象元素轉(zhuǎn)換成字符串以作比較  
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:"安全組"}
]

//進(jìn)行去重  
var arr = uniqeByKeys(array,['orgId','orgName']);  

斜體文字

2017年8月2日 12:42
編輯回答
蟲児飛

大胸弟,這個(gè)問(wèn)題自己動(dòng)動(dòng)手就ok拉。遍歷數(shù)組,判斷是否一樣,轉(zhuǎn)存,自己多多思考吧~~

2017年3月16日 02:42
編輯回答
深記你

按照你的對(duì)象來(lái)寫的,直接復(fù)制過(guò)去用就行。

 var newArr = [];
        var obj={};
        //比較數(shù)組內(nèi)的屬性,并將其添加為obj的對(duì)象
        for (var i = 0, length = arr.length; i < length; i++) {
            //如果obj的orgid存在,說(shuō)明已經(jīng)重復(fù)
            if(!obj[arr[i].orgId]){
                newArr.push(arr[i])
                //為obj的orgid屬性賦值
                obj[arr[i].orgId]=-1
            }
        }
        console.log(newArr)  //這就是去重后的數(shù)組
2018年7月20日 17:09
編輯回答
蝶戀花

最靠譜的方法還要分別對(duì)比對(duì)象屬性,對(duì)比對(duì)象部分可以使用尾遞歸吧,哪位大神,來(lái)貼一個(gè)!!!!

2017年1月10日 00:07
編輯回答
舊言

簡(jiǎn)單來(lái)說(shuō),

unique = [];
arr.forEach(e=>{if(!unique.includes(e)) unique.push(e)});
2018年7月8日 21:38