我有一系列对象,对象有属性说" a"," b"和" c"。 现在我需要过滤出具有" a&的唯一值的对象。 B&#34 ;. 然而,c扮演的角色是要保留哪些对象以及拒绝哪些对象。
如果我对属性a和b执行uniqBy,我将盲目地拒绝其他对象。它将保留它在数组中遇到的第一个对象并拒绝所有其他重复项。
如果您需要更多关于这个问题的澄清,请告诉我。
这就是我基于两个属性找到uniq对象的方法。 var uniqArray = _.uniqBy(obj,function(elem){return [elem.a,elem.b] .join();})
lodash uniq - choose which duplicate object to keep in array of objects
我们有更好的解决方案吗?
以下是输入和预期输出的示例 输入:var arrayOfObj = [{a:1,b:1,c:2},{a:1,b:1,c:1},{a:2,b:2,c:2}]; 输出:arrayOfObj = [{a:1,b:1,c:1},{a:2,b:2,c:2}];不应该有任何重复的a1,b1组合
答案 0 :(得分:1)
根据Lodash文档,结果值的顺序由它们在数组中出现的顺序决定。因此,您需要使用'c'属性对数组进行排序,以获得预期的结果。
为此,您可以使用_.sortBy。它根据属性或iteratee以asc顺序对集合进行排序。我认为您的问题可以直接使用属性解决,但您可以使用函数在需要时提供更准确的比较器。
之后,您只需执行uniqBy操作并检索结果:
var res = _(arrayOfObj)
.orderBy('c')
.uniqBy('a', 'b')
.value();
console.log(res);
这是fiddle。
正如我在评论中所读到的那样,你的'c'属性是一个时间戳。如果您想从最新到最新订购,您可以传递一个iteratee进行排序,以便通过'c'来反转自然顺序:
var res = _(arrayOfObj)
.orderBy(function(obj) {
return -(+obj.c);
})
.uniqBy('a', 'b')
.value();
console.log(res);
您可以在之前fiddle的此更新中查看。希望它有所帮助。
答案 1 :(得分:0)
有助于了解实际数据是什么以及您希望用它实现的目标。这是一个想法:根据a和b对对象进行分组,然后从每个分组中选择一个基于c的项目。
func subscribeEndpoint(json: JSON)
{
let sns = AWSSNS.defaultSNS()
let request = AWSSNSCreatePlatformEndpointInput()
let user_id = json["id"].string!
request.token = "XXXXX"
request.customUserData = user_id
print("token : \(token) user : \(user_id)")
request.platformApplicationArn = "XXXX"
sns.createPlatformEndpoint(request).continueWithBlock({ (task: AWSTask!) -> AnyObject! in
if task.error != nil {
print("Error dis: \(task.error!)")
} else {
let createEndpointResponse = task.result as! AWSSNSCreateEndpointResponse
print("endpointArn: \(createEndpointResponse.endpointArn)")
}
return nil
})
}