【问题标题】:Filter an array with other array用其他数组过滤一个数组
【发布时间】:2014-02-26 23:32:53
【问题描述】:

我有 2 个数组:

array1 包含object1 类型的对象。 object1 有一个属性 id

array2 包含object2 类型的对象。 object2 有一个属性 object1Id

我知道,array2 包含 ID 始终位于 array1 中的对象,但 array1 可以包含更多(或相等)对象。 展示它:

所以为了简化:array1 有所有对象,array2 有新对象。如何获取包含旧对象的数组..?我试图用谓词来做,但是做一个循环并将每个object1Id插入谓词感觉很奇怪。还有其他选择吗?怎么做才合适?

【问题讨论】:

    标签: ios objective-c nsarray nspredicate


    【解决方案1】:

    可以使用谓词,如果使用 KVC,则不需要循环。

    获取应排除的id数组:

    NSArray *excludeIds = [array2 valueForKey@"object1Id"];
    

    创建谓词:

    NSPredicate *filterPredicate = [NSPredicate predicateWithFormat:@"NOT (id IN %@)", excludeIds];
    

    然后过滤:

    NSArray *oldObjects = [array1 filteredArrayUsingPredicate:filterPredicate];
    

    【讨论】:

      【解决方案2】:

      您似乎正在尝试执行一组操作。有帮助的是NSMutableSet 类。使用setWithArray 创建集合。然后使用如下方法:

      • unionSet:
      • minusSet:
      • intersectSet:
      • setSet:

      获取符合您条件的子集。

      来源:NSMutableSet Class Reference

      希望对你有帮助。

      【讨论】:

      • 这种方式一般比较适合包含同类型对象的数组/集合
      【解决方案3】:
      NSArray*            oldIds = [array2 valueForKeyPath:@"object1Id"];
      NSPredicate*        predicate = [NSPredicate predicateWithFormat:@"NOT (id IN %@)", oldIds];
      NSArray*            objects = [array1 filteredArrayUsingPredicate:predicate];
      

      【讨论】:

        猜你喜欢
        • 2017-02-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-02
        • 2016-09-20
        相关资源
        最近更新 更多