繁体   English   中英

ios删除nsmutablearray内的nil字典

[英]ios remove nil dictionary inside of nsmutablearray

我有字典的nsmutable数组,但是数组中的一些字典为nil

<__NSArrayI 0x20895690> 
(
    {
        sales = "15023.00";
    }
)
,
<__NSArrayI 0x20895600>
(
    <null>
)
,
<__NSArrayI 0x20895610>
(
    <null>
)

你们谁都知道如何删除零个对象? 你们谁都知道如何删除零个对象?

您可以创建满足某些情况的类别。 它将删除一个空数组,一个[NSNull null]对象以及一个包含单个[NSNull null]对象的NSArray。 如果您发现使用的数据具有其他格式,则可以进一步自定义。

@interface NSMutableArray (EmptyObjects)
- (NSMutableArray *)so_removeEmptyObjects;
@end

@implementation NSMutableArray (EmptyObjects)

BOOL arrayContainsSingleNullObject(id obj)
{
    return  [obj isKindOfClass:[NSArray class]] &&
    [obj count] == 1 &&
    [obj lastObject] == [NSNull null];
}

BOOL objectCountIsZero(id obj)
{
    return ([obj respondsToSelector:@selector(count)] && ([obj count] == 0));
}


- (NSMutableArray *)so_removeEmptyObjects
{
    NSIndexSet *emptyIndexes = [self indexesOfObjectsPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) {
        return arrayContainsSingleNullObject(obj) ||
                objectCountIsZero(obj) ||
                (obj == [NSNull null]);

    }];
    [self removeObjectsAtIndexes:emptyIndexes];
    return self;
}

@end

测试一下:

NSMutableArray *mutableArray = [@[ @{@"sales" : @"15023.00"}, @[ [NSNull null] ], [NSNull null], @[] ] mutableCopy];
NSLog(@"%@", mutableArray);
[mutableArray so_removeEmptyObjects];
NSLog(@"%@", mutableArray);

之前:

(
    {
        sales = "15023.00";
    },
    (
        "<null>"
    ),
    "<null>",
    (
    )
)

后:

(
    {
        sales = "15023.00";
    }
)

从您的输出判断,您正在处理的是字典数组数组,因此应该过滤掉它是空数组(内部)。

NSMutableArray *originalData = [@[
                                  @[@{@"sales":@15023}],
                                  @[[NSNull null]],
                                  @[[NSNull null]]
                                 ]  mutableCopy];

NSLog(@"%@", [originalData debugDescription]); // Your original output

// Filter out the empty arrays (and all arrays not containing dictionaries
[originalData filterUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) {
    if (![evaluatedObject isKindOfClass:[NSArray class]]) return NO; // Not an array

    NSArray *array = evaluatedObject;
    if (!array.count) return NO; // Empty

    if (![array[0] isKindOfClass:[NSDictionary class]]) return NO; // First item is not a dictionary

    return YES; // Everything is fine. Keep this item
}]];

您可以使用谓词进行此操作:

    NSMutableArray *mutableArray = [@[ @[@{@"sales" : @"15023.00"}], @[[NSNull null]], @[[NSNull null]] ] mutableCopy];

    NSLog(@"Array is: %@", [mutableArray debugDescription]);

    NSPredicate *pred= [NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) 
   {
        return ! ( [evaluatedObject isKindOfClass:[NSArray class]] && [evaluatedObject lastObject] == [NSNull null] );
    }];
    [mutableArray filterUsingPredicate:pred];

    NSLog(@"Array is now: %@", [mutableArray debugDescription]);

结果:

前值:

Array is: <__NSArrayM 0xa324130>(
<__NSArrayI 0xa3240b0>(
{
    sales = "15023.00";
}
)
,
<__NSArrayI 0xa3240f0>(
<null>
)
,
<__NSArrayI 0xa324100>(
<null>
)

)

发布谓词:

Array is now: <__NSArrayM 0xa324130>(
<__NSArrayI 0xa3240b0>(
{
    sales = "15023.00";
}
)

)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM