在 NSArray 中添加缺失日期

Adding Missing Dates in NSArray

我有一个包含过去 5 天的数组。它是这样构建的:

(
    "2015-01-27",
    "2015-01-26",
    "2015-01-25",
    "2015-01-24",
    "2015-01-23",
)

我有一个来自 FetchRequest 的第二个 NSArray

(
    {
        daySectionIdentifier = "2015-01-24";
        sumValue = 2500;
    },
    {
        daySectionIdentifier = "2015-01-25";
        sumValue = 1487;
    },
    {
        daySectionIdentifier = "2015-01-27";
        sumValue = 750;
    }
)

我想要的是匹配我的第一个数组的日期在第一个数组中得到一个值,缺少的日期没有值。

因此最终结果将如下所示:

(
    {
        daySectionIdentifier = "2015-01-23";
        sumValue = 0;
    },
    {
        daySectionIdentifier = "2015-01-24";
        sumValue = 2500;
    },
    {
        daySectionIdentifier = "2015-01-25";
        sumValue = 1000;
    },
    {
        daySectionIdentifier = "2015-01-26";
        sumValue = 0;
    },
    {
        daySectionIdentifier = "2015-01-27";
        sumValue = 750;
    }
)

有人知道如何做到这一点吗?提前致谢

好的,事实证明这并不太难,希望这就是您所追求的:

首先考虑这个问题,这里的问题是让数据以正确的格式进行分析,所以首先我把它从一个充满字典的数组改为一个数组数组,每个数组都有包含信息(我知道这不是最优雅的解决方案,但最有效的解决方案 none 较少)

// Here is our array of past dates
NSArray * pastDateDays = @[@"2015-01-27", @"2015-01-26", @"2015-01-25", @"2015-01-24", @"2015-01-23"];

// Here is our array from the request, this is full of dictionaries
NSArray * fetchRequest = @[@{@"daySectionIdentifier" : @"2015-01-24", @"sumValue": @2500}, @{@"daySectionIdentifier" : @"2015-01-25", @"sumValue": @1487}, @{@"daySectionIdentifier" : @"2015-01-27", @"sumValue": @750}];

// Here is a mutable array we will be adding to
NSMutableArray * request = [NSMutableArray arrayWithArray:fetchRequest];

所以现在我们准备开始将信息转换为更好的格式。

// This function gets the array in an array of arrays where each array has a date and a value
fetchRequest = [self fetchRequestToArray:fetchRequest];

// Not too complicated just taking it out of one and putting it in another
- (NSArray *)fetchRequestToArray: (NSArray *)array {

    NSMutableArray * tempArray = [NSMutableArray new];

    for (NSDictionary * dict in array) {

        NSArray * temp = @[[dict objectForKey:@"daySectionIdentifier"], [dict objectForKey:@"sumValue"]];

        [tempArray addObject:temp];
    }

    return [NSArray arrayWithArray:tempArray];
}

接下来我们遍历日期数组中日期的可变数组,如果它们在我们请求的数组中匹配,我们将删除它们:

NSMutableArray * tempDates = [NSMutableArray arrayWithArray:pastDateDays];

for (NSArray * array in fetchRequest) {

    NSString * date = array.firstObject;

    for (NSString * string in pastDateDays) {

        if ([date isEqualToString:string]) {

            [tempDates removeObject:string];
        }
    }
}

这给我们留下了一组日期,这些日期包含在我们的日期数组中,但不包含在我们请求的数据中。这些是我们需要为其添加零值的日期。

同样,这也相对简单:

for (NSString * date in tempDates) {

    NSDictionary * dict = [NSDictionary dictionaryWithObjects:@[date, @0]
                                                           forKeys:@[@"daySectionIdentifier", @"sumValue"]];

    [request addObject:dict];
}

这 returns 我们得到了所需的数组。

唯一可能需要添加的是此数组未按日期顺序排列。这可以使用多种方法轻松排序。我在几秒钟内找到并添加了这个,但如果需要,您可以选择更复杂的:

NSSortDescriptor * sortByDate = [NSSortDescriptor sortDescriptorWithKey:@"daySectionIdentifier"
                                                             ascending:YES];
NSArray * sortDescriptors = [NSArray arrayWithObject:sortByDate];
NSArray * sortedArray = [request sortedArrayUsingDescriptors:sortDescriptors];

这将以以下格式输出日期:

最后的数组是名为request的数组,是一个mutableArray

<__NSArrayI 0x7fade848f480>(
{
    daySectionIdentifier = "2015-01-23";
    sumValue = 0;
},
{
    daySectionIdentifier = "2015-01-24";
    sumValue = 2500;
},
{
    daySectionIdentifier = "2015-01-25";
    sumValue = 1487;
},
{
    daySectionIdentifier = "2015-01-26";
    sumValue = 0;
},
{
    daySectionIdentifier = "2015-01-27";
    sumValue = 750;
}
)

我认为这是期望的输出。

注意事项: - 这些值是 NSNumbers 而不是整数,因为我们不能在 NSdictionary

中存储整数
  • 这不是最优雅的解决方案 - 我使用了很多数组,我相信它可以重构。这段代码确实有效,因此可以用来加深理解——这段代码在直接复制时应该可以工作,但可能有一些地方需要调整,因为它是从我的 XCode[=16= 复制的一个很长的答案]

  • 字符串需要完全采用这种格式才能工作,如果不是,则需要调整此解决方案。

希望对您有所帮助