11 回答

TA貢獻(xiàn)2036條經(jīng)驗(yàn) 獲得超8個(gè)贊
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;
}, {}),
);
我來個(gè)最簡(jiǎn)單的,but 有個(gè)缺點(diǎn),arr里面的對(duì)象必須能被 JSON.stringify 處理

TA貢獻(xiàn)1784條經(jīng)驗(yàn) 獲得超2個(gè)贊
stringify
那位兄弟的去重方法是可以的(之前說穩(wěn)健是不對(duì)的,還不夠穩(wěn)?。?br/>不過代碼也是要考慮實(shí)際業(yè)務(wù)場(chǎng)景的,這樣的數(shù)組數(shù)據(jù)是怎么來的呢?orgId
是不是已經(jīng)就是有著 唯一Id 的作用的,是不是 orgId
一致的對(duì)象,就代表著對(duì)象是一致的。如果是的話,那就沒必要stringify
了,直接拿orgId
當(dāng)key去重就好了

TA貢獻(xiàn)1851條經(jīng)驗(yàn) 獲得超3個(gè)贊

TA貢獻(xiàn)1820條經(jīng)驗(yàn) 獲得超9個(gè)贊
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();

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超5個(gè)贊
可以這樣寫
//將對(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']);
斜體文字

TA貢獻(xiàn)1898條經(jīng)驗(yàn) 獲得超8個(gè)贊
可以了解下es6的set:
function dedupe(array){
return Array.from(new Set(array));
}
dedupe([1,1,2,3]) //[1,2,3]

TA貢獻(xiàn)1770條經(jīng)驗(yàn) 獲得超3個(gè)贊
以上答案都不支持排序混亂的情況下,且優(yōu)化一下(避免用Object.values()再進(jìn)行一次迭代),我補(bǔ)充下:
不改變目標(biāo)數(shù)組
因?yàn)橛袆?chuàng)建數(shù)組并追加的行為,且無法result=Array(length)來讓這行為提速,因此這種方式的效率會(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 );
添加回答
舉報(bào)