我有 nsmutable 字典数组,但数组中的一些字典是 nil
<__NSArrayI 0x20895690>
(
{
sales = "15023.00";
}
)
,
<__NSArrayI 0x20895600>
(
<null>
)
,
<__NSArrayI 0x20895610>
(
<null>
)
你们中的任何人都知道如何删除 nil 对象吗?你们中的任何人都知道如何删除 nil 对象吗?
我有 nsmutable 字典数组,但数组中的一些字典是 nil
<__NSArrayI 0x20895690>
(
{
sales = "15023.00";
}
)
,
<__NSArrayI 0x20895600>
(
<null>
)
,
<__NSArrayI 0x20895610>
(
<null>
)
你们中的任何人都知道如何删除 nil 对象吗?你们中的任何人都知道如何删除 nil 对象吗?
您可以创建一个适合一些场景的类别。它将删除一个空数组、一个 [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";
}
)
)