Coffeescript / Node.js:如何从对象数组中删除重复的对象?

我怎样才能打开这个对象的数组(有一些重复的对象):

items = [ { TYPEID: 150927, NAME: 'Staples', COLOR: 'Silver' }, { TYPEID: 1246007, NAME: 'Pencils', COLOR: 'Yellow' }, { TYPEID: 1246007, NAME: 'Pencils', COLOR: 'Blue' }, { TYPEID: 150927, NAME: 'Staples', COLOR: 'Black' }, { TYPEID: 1248350, NAME: 'Staples', COLOR: 'Black' }, { TYPEID: 1246007, NAME: 'Pencils', COLOR: 'Blue' }, { TYPEID: 150927, NAME: 'Staples', COLOR: 'Silver' }, { TYPEID: 150927, NAME: 'Fasteners', COLOR: 'Silver' } ] 

进入这个:

 items = [ { TYPEID: 150927, NAME: 'Staples', COLOR: 'Silver' }, { TYPEID: 1246007, NAME: 'Pencils', COLOR: 'Yellow' }, { TYPEID: 1246007, NAME: 'Pencils', COLOR: 'Blue' }, { TYPEID: 150927, NAME: 'Staples', COLOR: 'Black' }, { TYPEID: 1248350, NAME: 'Staples', COLOR: 'Black' }, { TYPEID: 150927, NAME: 'Fasteners', COLOR: 'Silver' } ] 

通过筛选出两个重复的对象(silverlight的主食和蓝色的铅笔)?

似乎应该有一个简单的方法来做到这一点,但我还没有find一个简单的解决scheme。

我已经看到了一些JavaScript / jQuery代码这样做,但我不是最好的转换成咖啡的脚本。

更新:

通常会有不同的对象具有非常相似的属性。

在实际应用中,每个对象都有25个属性的潜力。

如果每个属性都相等,我只想删除对象。

更新2

这是最终为我工作的代码 – (感谢rjz

 unique = (objAry, callback) -> results = [] valMatch = (seen, obj) -> for other in seen match = true for key, val of obj match = false unless other[key] == val return true if match false objAry.forEach (item) -> unless valMatch(results, item) results.push(item) callback null, results 

这就是我所说的:

 unique items, (err, items) -> console.log items 

取决于你想要检查平等的深度,你可能只是假设USERID字段的唯一性,并做这样的事情:

 ids = [] # Contains list of "seen" IDs result = [] # Contains list of unique users users.forEach (u) -> if result.indexOf(u.USERID) == -1 result.push(u) ids.push(u.USERID) 

如果您需要进行更深入的匹配,并且没有可用的主键(可能是更大的问题的标志),则可以为等同性创build更复杂的testing:

 valMatch = (seen, obj) -> for other in seen match = true for key, val of obj match = false unless other[key] == val return true if match false result = [] seen = [] data.forEach (datum) -> unless valMatch(result, datum) result.push(datum) seen.push(datum) 

我会使用underscore.js并尝试这样的事情

 result = item[0] for item in _.groupBy(users, (user) => user.USERID) 

它没有testing你;-)显然这假设我们只检查USERID

如果你不仅可以检查USERID,你当然可以将所有对象转换成json-strings,然后比较jsonstring

 result = item[0] for item in _.groupBy(users, (user) => user.toJSON()) 

显然这是一个肮脏的黑客,将依靠所有的浏览器和引擎序列化的对象和他们的插槽按照创build/分配的事实。

所以无论如何,rjz的解决scheme肯定是更好的解决scheme,但是这很可能会起作用。