2016-11-24 108 views
2

比方說,我有一個這樣的數組:重複的屬性中刪除的數組對象

var arr1 = [ 1, 1, 'a', 'a' ]; 

我想刪除重複,這個片段是真棒:

var deduped = arr1.filter(function (el, i, arr) { 
    return arr.indexOf(el) === i; 
}); 

但我得到這個數組,我想刪除具有重複屬性的對象:

var obj1 = { 
    name: "John", 
    id: 1 
}; 
var obj2 = { 
    name: "Moe", 
    id: 1 
}; 
var obj3 = { 
    name: "Jane", 
    id: 2 
}; 

var arr2 = [obj1, obj2, obj3]; 

如何編寫函數以刪除eithe r(在這種情況下)obj1obj2之一,因爲它們具有相同的id

我不想同時刪除!

JsFiddle

Reference for code snippet

在此先感謝。

+1

當你說刪除重複你的意思是其中之一或他們兩個? – n00dl3

+0

其中之一,對不起,我會更新澄清。 – urbz

回答

3

使用Array#filterthisArg

thisArg,價值在執行回調時爲this使用。

var obj1 = { 
 
    name: "John", 
 
    id: 1 
 
}; 
 
var obj2 = { 
 
    name: "Moe", 
 
    id: 1 
 
}; 
 
var obj3 = { 
 
    name: "Jane", 
 
    id: 'toString' 
 
}; 
 

 
var arr2 = [obj1, obj2, obj3]; 
 
var filtered = arr2.filter(function(el) { 
 
    if (!this[el.id]) { 
 
    this[el.id] = true; 
 
    return true; 
 
    } 
 
    return false; 
 
}, Object.create(null)); 
 
console.log(filtered);

+1

不錯的解決方案!我會爲此創建一個var,但使用'thisArg'是一個非常好的主意...... – n00dl3

+1

非常棒,謝謝你。 – urbz

+1

通常的'{}'陷阱適用(嘗試'id:'toString'') – georg

1

您可以使用檢查和分配到一個哈希對象的壓縮版本。

var obj1 = { name: "John", id: 1 }, 
 
    obj2 = { name: "Moe", id: 1 }, 
 
    obj3 = { name: "Jane", id: 2 }, 
 
    arr2 = [obj1, obj2, obj3], 
 
    filtered = arr2.filter(function(a) { 
 
     return !this[a.id] && (this[a.id] = true); 
 
    }, Object.create(null)); 
 

 
console.log(filtered);

+0

非常好的方法和一個不錯的解決方案。 +1 – urbz

+0

@妮娜 - 你是向我介紹'thisArg'的人之一。尼斯速記:) – Rayon

1

我們可以添加一個步驟之前

var arr2 = [obj1, obj2, obj3]; 

var ids = arr2.map(function(obj){ 
    return obj.id; 
}) 

var deduped2 = arr2.filter(function (el, i, arr) { 
    return ids.indexOf(el.id) === i; 
}); 
0

所有對象ID映射考慮到u有數組重複號碼

int a {1,2,3,4,5,5,6,4,7,1,2} 

現在揀最大來自此數組的名稱爲的整數。例如在這個數組中它是7。 現在創建一個名爲b的新數組,其大小爲數組a中最大的數字。

int b[7] 

現在開始遍歷數組a。從每個索引中選擇數字,例如在數組a的索引0處,它是1。現在轉到數組b的索引1並檢查是否寫入了0寫入1,如果已經在該索引上寫入了1,則從數組a中刪除該數字。通過這種方式,您可以刪除數組a中的所有重複項。

相關問題