0

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

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

你们中的任何人都知道如何删除 nil 对象吗?你们中的任何人都知道如何删除 nil 对象吗?

4

3 回答 3

0

您可以创建一个适合一些场景的类别。它将删除一个空数组、一个 [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";
    }
)
于 2013-07-16T20:49:04.257 回答
0

从您的输出来看,您正在处理一个字典数组数组,因此您应该过滤掉空数组(内部)。

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
}]];
于 2013-07-16T21:05:16.063 回答
0

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

    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";
}
)

)
于 2013-07-16T21:13:33.340 回答