【问题标题】:How to remove if the json data is equals to nil?如果json数据等于nil,如何删除?
【发布时间】:2015-08-20 10:52:46
【问题描述】:
category =     (
                {
            "category_id" = 18;
            column = 1;
            description = "Electrician Works";
            image = "images/Electrician.jpg";
            "meta_description" = "Electrician Works";
            "meta_keyword" = "Electrician Works";
            name = Electrician;
            "parent_id" = "";
            "sort_order" = 3;
            status = enable;
            subcategory =             (
            );
            top = "";
        },
                {
            "category_id" = 19;
            column = 1;
            description = "Plumbing Works";
            image = "images/Plumber.png";
            "meta_description" = "Plumbing Works";
            "meta_keyword" = "Plumbing Works";
            name = Plumber;
            "parent_id" = "";
            "sort_order" = 1;
            status = disable;
            subcategory =             (
            );
            top = "";
        },
{
            "category_id" = 37;
            column = 0;
            description = "";
            image = "images/SUV.jpg";
            "meta_description" = "";
            "meta_keyword" = "";
            name = SUV;
            "parent_id" = 20;
            "sort_order" = 3;
            status = enable;
            subcategory =             (
            );
            top = "";
        }

如果 parent_id ="" 则必须删除其他值。

我在这里存储了值名称和 parent_id

 {
    name = Microwave;
    parent = "";
},
    {
    name = Hatchback;
    parent = 20;
},
    {
    name = Sedan;
    parent = 20;
},
    {
    name = SUV;
    parent = 20;
}

如果父 ID 不存在,那么我必须从数组中删除,任何人都可以帮助我找出这个问题。

-(void)responseFunction:(NSMutableDictionary*)response
{
    BOOL sucess;
    sucess =[response objectForKey:@"sucess"];
    if(!sucess)
    {
        NSLog(@"%@",response);
        arrDicCategory=[response objectForKey:@"category"];
        for(NSDictionary *dicAllCategory in arrDicCategory)
        {
            NSMutableDictionary *dicStorage=[[NSMutableDictionary alloc]init];
            [dicStorage setObject:[[dicAllCategory objectForKey:@"name"] length] !=0?[dicAllCategory objectForKey:@"name"]:@"" forKey:@"name"];
//            [dicStorage setObject:[dicAllCategory objectForKey:@"parent_id"]!=Nil?[dicAllCategory objectForKey:@"parent"]:@"" forKey:@"parentid"];
            [dicStorage setObject:[dicAllCategory objectForKey:@"parent_id"] forKey:@"parent"];
            [arrDicName addObject:dicStorage];
            NSLog(@"%@",arrDicName);
        }
    }
}

这是我的代码...

I NEED OUTPUT LIKE THIS

    name = Hatchback;
    parent = 20;


    name = Sedan;
    parent = 20;


    name = SUV;
    parent = 20;

我正在尝试使用以下代码删除值:

for(int i=0; i<arrDicName.count ; i++)
        {
          if([[arrDicName objectAtIndex:i]objectForKey:@"parent"]==Nil)
            {
                [arrDicName removeObject:[[arrDicName objectAtIndex:i]objectForKey:@"parent"]];
                NSLog(@"AfterRemovingFromThearray%@",arrDicName);
            }
        }

我的代码有问题我理解但我找不到所以最后我来这里帮助我的朋友。

【问题讨论】:

  • 为什么要一个字典数组,而一个字典就可以(更快的查找)?
  • 在 for 循环中我正在存储值.....
  • for 循环中,您是否有理由不只是将您的条件包含在if 中并采取适当的措施?
  • 因为我的 json 数据中有多个值,这只是我放置循环并将值存储在另一个字典中.. @CRD
  • 您想从类别响应或您提供的第二个数组中删除值?

标签: objective-c nsarray nsjsonserialization


【解决方案1】:

您的代码片段有几个问题:

  1. 您正在针对Nil 测试"parent" 密钥。键永远不会是nil,因为它们在 Objective-C 集合类中是不允许的。而是测试length &gt; 0
  2. 您正在从正在枚举的数组中删除对象,从而有效地更改了数组的长度。这将导致索引越界异常或丢失元素等问题。

最好的办法是创建一个新数组并复制通过测试的元素:

NSMutableArray filteredArray = [NSMutableArray new];
for (NSDictionary *dict in arrDicName)
{
    NSString *parent = dict[@"parent"];
    if (parent.length > 0)
        [filteredArray addObject:dict];
}
arrDicName = filteredArray;

【讨论】:

    【解决方案2】:

    试试下面的代码。我根据您的要求创建了一个虚拟字典和数组。

    NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
    [dict setObject:@"" forKey:@"parent_id"];
    [dict setObject:@"abc" forKey:@"name"];
    
    NSMutableDictionary *dict1 = [[NSMutableDictionary alloc] init];
    [dict1 setObject:@"1" forKey:@"parent_id"];
    [dict1 setObject:@"abcq" forKey:@"name"];
    
    NSMutableDictionary *dict2 = [[NSMutableDictionary alloc] init];
    [dict2 setObject:@"" forKey:@"parent_id"];
    [dict2 setObject:@"sss" forKey:@"name"];
    
    NSMutableDictionary *dict3 = [[NSMutableDictionary alloc] init];
    [dict3 setObject:@"2" forKey:@"parent_id"];
    [dict3 setObject:@"ddd" forKey:@"name"];
    
    arrTemp = [[NSMutableArray alloc] init];
    [arrTemp addObject:dict];[arrTemp addObject:dict1];[arrTemp addObject:dict2];[arrTemp addObject:dict3];
    
    NSMutableIndexSet *indexesToDelete = [NSMutableIndexSet indexSet];
    NSUInteger currentIndex = 0;
    
    for (id obj in arrTemp) {
        if([[obj objectForKey:@"parent_id"] isEqualToString:@""]){
            [indexesToDelete addIndex:currentIndex];
        }
        currentIndex++;
    }
    
    [arrTemp removeObjectsAtIndexes:indexesToDelete];
    NSLog(@"%@", arrTemp);
    

    希望对您有所帮助。如果它不能解决您的问题,请告诉我。

    【讨论】:

    • 为什么是setValue 而不是setObject
    • @trojanfoe - 是的,你是对的,setObject 会更通用。会改正的。
    • @z22 bro,这项工作一直在等待中,所以等两天后我会接受答案
    【解决方案3】:
    - (BOOL)isEmptyString:(NSString *)yourParentID
    {
        BOOL isEmp = NO;
    
        if([[yourParentID stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] length] == 0)
        {
            isEmp = YES;
        }
        else
        {
            isEmp = NO;
        }
    
        return isEmp;
    }
    

    遵循以下代码

    NSString *parentId = [NSString stringWithFormat:@"%@",[[arrDicName objectAtIndex:i]objectForKey:@"parent"]];
    
        if([self isEmptyString:parentId])
        {
            // Parent id is nil 
            // Do the rest
        }
        else
        {
            // Parent id is not nil
        }
    

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 2023-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-02
      • 2019-01-30
      • 1970-01-01
      • 2021-12-09
      相关资源
      最近更新 更多