0

私は辞書の nsmutable 配列を持っていますが、配列内の辞書のいくつかは nil です

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

nil オブジェクトを削除する方法を知っている人はいますか? nil オブジェクトを削除する方法を知っている人はいますか?

4

3 に答える 3

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 に答える