[英]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.