【问题标题】:Get all keys of a multidimensional dictionary获取多维字典的所有键
【发布时间】:2016-01-22 05:13:46
【问题描述】:

我有一本像这样的字典:

{
dataTypes =     (
            {
        dataType = "datatype1";
        editable = 1;
        maxValue = 300;
        minValue = 0;
        order = 1;
        title = "Title 1";
        type = numeric;
        units = kg;
    },
            {
        dataType = "datatype 2";
        editable = 1;
        maxValue = 300;
        minValue = 0;
        order = 2;
        title = "title2";
        type = numeric;
        units = gm;
    },
            {
        dataType = "datatype3";
        editable = 1;
        maxValue = 300;
        minValue = 20;
        order = 3;
        title = "title3";
        type = numeric;
        units = kg;
    }
);
name = "Name";
order = 1
title = "Title";
}

我想获取这本字典中的所有键。

我尝试了[myDict allKeys],但它只返回四个键:DataTypesnameordertitle

我要检索所有密钥:dataTypeeditablemaxvalue

【问题讨论】:

  • myArray 不是数组,而是字典。那本字典有 4 个键。 dataTypes 键有一个数组。这是一个字典数组。
  • 好吧,你能告诉我我怎样才能做到这一点吗?
  • 挖掘你需要的字典并获取它的键。这方面的代码示例数不胜数。
  • @DivyeshSavaliya 您想要所有键以及名称、顺序、标题、数据类型、可编辑、macvalue、minvalue 等...??
  • 是的....但我想制作将参数作为字典并返回此字典中的所有键的方法。

标签: objective-c dictionary


【解决方案1】:

试试这个。

NSArray *tempArray = [myDict objectForKey:@"dataTypes"];

NSDictionary *tempDictionary = (NSDictionary *)tempArray[0];

[tempDictionary allKeys] 会有你想要的。

编写这个方法。

- (NSDictionary *)dictionaryFromArrayWithinDictionary:(NSDictionary *)dictionary withKey:(NSString *)key{
    NSArray *tempArray = [dictionary objectForKey:key];
    return (NSDictionary *)tempArray[0]; 
}

这将返回内部字典,只需在该字典上调用 `allKeys',您将获得所需的所有键。

【讨论】:

  • [myDict objectForKey:@"dataTypes"] 在这种情况下返回 NSArray
  • 但是如果我想创建从字典返回键的方法呢?每次键都是“dataTypes”是不必要的。
  • 如果你有字典,那么你可以直接从allKeys属性中获取。
  • 正确阅读我的问题..我已经尝试过 allKeys 但它只返回四个键。
  • 编写一个方法,通过将键传递给它来返回字典数组...然后您可以从该字典中获取一个对象并从allKeys属性中获取键
【解决方案2】:

您需要递归地遍历您的字典,以及字典可能包含的任何数组,等等。这可以通过添加到所有对象的recursiveKeys 方法很好地完成,该方法为非容器对象返回一个空数组,并遍历容器对象的容器:

@interface NSObject(MyCategory)
- (NSArray)recursiveKeys;
@end

@implementation NSObject(MyCategory)
- (NSArray)recursiveKeys {
    return @[];
}
@end

@implementation NSArrray(MyCategory)
- (NSArray)recursiveKeys {
    NSMutableArray *result = [NSMutableArray array];
    for (id item in self) {
        [result addObjectsFromArray:[item recursiveKeys]];
    }
    return [result copy]; //return an immutable array
}
@end

@implementation NSSet(MyCategory)
- (NSArray)recursiveKeys {
    NSMutableArray *result = [NSMutableArray array];
    for (id item in self) {
        [result addObjectsFromArray:[item recursiveKeys]];
    }
    return [result copy]; //return an immutable array
}
@end

@implementation NSDictionary(MyCategory)
- (NSArray)recursiveKeys {
    NSMutableArray *result = [self.allKeys mutableCopy];
    for (id key in self) {
        [result addObjectsFromArray:[self[key] recursiveKeys];
    }
    return [result copy]; //return an immutable array
}
@end

你可以这样使用它:

NSArray *keys = myDictionary.recursiveKeys;

请原谅任何语法错误,我现在没有 Xcode 在我面前,我只是在这里输入代码。

【讨论】:

  • 这看起来不会使多维字典变平吗?
  • @trojanfoe 这将返回一个字符串数组(如果所有键都是字符串),如果您将嵌入式字典视为多级字符串数组,您可以称之为扁平化:)
猜你喜欢
  • 2016-12-18
  • 1970-01-01
  • 2016-05-27
  • 2017-01-07
  • 2016-08-08
  • 2014-11-27
  • 2012-12-18
  • 1970-01-01
  • 2017-08-30
相关资源
最近更新 更多