Lodash选择拒绝哪些重复

时间:2016-10-10 15:29:04

标签: lodash

我有一系列对象,对象有属性说" 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组合

2 个答案:

答案 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
        })
    }