如何转换此对象数组(具有一些重复对象):
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' }
]
...过滤掉两个重复的物体(银色的钉书钉和蓝色的铅笔)?
似乎应该有一个简单的方法来做到这一点,但我还没有找到一个简单的解决方案。
我已经看到了一些javascript / jquery代码可以做到这一点,但我不是最好将它们转换成coffeescript。
更新:
通常会有不同的对象具有非常相似的属性。
在实际应用中,每个对象都有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
答案 0 :(得分:2)
根据您希望检查相等性的程度,您可能只假设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)
如果您需要进行更深入的匹配并且没有可用的主键(可能是更大问题的迹象),您可以创建更复杂的平等测试:
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)
答案 1 :(得分:0)
我会使用underscore.js并尝试这样的事情
result = item[0] for item in _.groupBy(users, (user) => user.USERID)
它没有经过测试;-)显然这假设我们只检查USERID
如果您不仅可以检查USERID,您当然可以将所有对象转换为json字符串,然后比较json字符串
result = item[0] for item in _.groupBy(users, (user) => user.toJSON())
显然这是一个肮脏的黑客,它将依赖于所有浏览器和引擎按创建/分配顺序序列化对象及其插槽的事实。
所以无论如何rjz的解决方案肯定是更好的解决方案,但这很可能也会有效。
答案 2 :(得分:0)
这是一个古老的问题-但历史遗物是...
let连接数组中的对象: (将所有值放入数组并将其连接到字符串)
join_object=(o)->
["#{attr}:#{value}" for attr, value of o].join()
这将为每个obj生成一个输出。
TYPEID:150927,NAME:Staples,COLOR:Silver
并通过修改“独特”数组的Coffee方法来做一个深层的独特操作:
Array::unique_deep = ->
output = {}
output[join_object(@[key])] = @[key] for key in [0...@length]
value for key, value of output
简短并保存。
结果:
Array::unique_deep = ->
join_object=(o)->
["#{attr}:#{value}" for attr, value of o].join()
output = {}
output[join_object @[key]] = @[key] for key in [0...@length]
value for foo_key, value of output
答案 3 :(得分:-2)
Array::uniq = ->
unique=(v, k, self) ->
self.indexOf(v)==k
@.filter(unique)
# console.log([1,2,3,3,4,4,5].uniq())