2016-11-24 109 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中的所有重复项。

相关问题