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,但是这很可能会起作用。