【问题标题】:Replace all keys in an array of dictionary in cocoa替换可可字典数组中的所有键
【发布时间】:2026-01-21 18:15:03
【问题描述】:

我有一个由字典数组组成的可变数组:

NSArray *myArray    
({
    {
        "COL_1" = Jhon;
        "COL_2" = 01/27/13;
        "COL_3" = THAILAND;
        "COL_4" = 5000;
        "COL_5" = No;
    },
    {
        "COL_1" = Peter;
        "COL_2" = 01/27/13;
        "COL_3" = US;
        "COL_4" = 4000;
        "COL_5" = No;
    }
 })

数组中的所有字典都有相同的键。我想用一组来自 NSArray 的新密钥替换现有密钥。最终的数组应该是 -

NSArray *myArray    
({
    {
        "A" = Jhon;
        "B" = 01/27/13;
        "C" = THAILAND;
        "D" = 5000;
        "E" = No;
    },
    {
        "A" = Peter;
        "B" = 01/27/13;
        "C" = US;
        "D" = 4000;
        "E" = No;
    }
 })

我不想要一个嵌套的 for 循环,在该循环中我必须遍历数组中的每个元素,并再次遍历每个字典,遍历每个键,以更改键。 我所做的如下:

NSArray *myDictFnalKeys = [NSArray arrayWithObjects:@"A",@"B",@"C",@"D",@"E",nil];  // Here we have set our own keys which will replace the existing keys .
NSMutableArray *myNewArray = [[[NSMutableArray alloc] init] autorelease]; //create a new mutable dictionary
for (id myArrayInstance in array) {
            NSDictionary *myNewDict = [[NSDictionary alloc] initWithObjects:[myArrayInstance allObjects] forKeys:myDictFnalKeys]; // copy the object values from old dictionary and keys from the new array.
            [myNewArray addObject:myNewDict];
    }

问题是字典的值没有按正确的顺序排列。 [myArrayInstance allObjects] 没有返回正确的顺序,因此最终数组的顺序不正确。它的到来就像-

NSMutableArray *newArray
({
    {
        A = "01/27/13";
        B = No;
        C = Jhon;
        D = 5000;
        E = THAILAND;
    },
    {
        A = "01/27/13";
        B = No;
        C = Peter;
        D = 4000;
        E = US;
    }

})

【问题讨论】:

  • 字典是无序的,你期待什么?
  • 我的目标是用新键替换旧键。我遵循这种方法,认为字典将以有序的方式返回值。有什么方法可以实现所需的功能。
  • NSMutableArray *myNewArray = [NSMutableArray 数组]; //创建一个新的可变字典(自动发布)

标签: cocoa nsarray nsdictionary


【解决方案1】:

你快到了,唯一的问题是对allObjects 的调用,正如你发现的那样,它以任意顺序返回对象。而是定义一个原始键数组:

NSArray *originalKeys = @[@"COL_1", @"COL_2", @"COL_3", @"COL_4", @"COL_5"];

元素的顺序与myDictFnalKeys 中的替换顺序相同。现在将对 allObjects 的调用替换为:

[myDict objectsForKeys:originalKeys notFoundMarker:NSNull.null]

这将返回与在originalKeys 中找到的键按顺序 匹配的对象数组(如果缺少键,则结果数组将包含notFoundMarker 中的任何NSNull.null案例)。

这样做,您的代码就会工作。

【讨论】:

    【解决方案2】:

    您可以使用 'objectsForKeys:notFoundMarker:' 按请求的顺序获取值。传递 [NSNULL null] 作为第二个参数。 (这真的无关紧要,所有的值都存在于字典中,并且您不会尝试获取未定义键的值。)

    【讨论】: