gpt4 book ai didi

iphone - NSPredicate 子查询语法

转载 作者:可可西里 更新时间:2023-11-01 04:07:39 25 4
gpt4 key购买 nike

我有一些不友好的字典数组,而字典数组又包含数据数组,我试图根据传递谓词的任何内部数组来过滤外部数组。我似乎无法创建一个 NSPredicate 来完成这项工作。我开始于:

NSPredicate *lookupPredicate = [NSPredicate predicateWithFormat:
@"row_values.property_id == %@ AND row_values.property_value == %@",
@"47cc67093475061e01000540", @"Male"];

[dataRows filterUsingPredicate:lookupPredicate];

这不返回任何值。我已经尝试过各种形式的 ANY,但我似乎无法找到它可以解析的任何内容。同样,目标是只保留那些内部数组字典内容的任何谓词为真的外部数组字典。我可以看到我花了一天的时间来弄清楚使这项工作成功的咒语……有什么想法吗?

dataRows:
(
{
row = 1;
"row_values" = (
{
"property_id" = 47cc67093475061e01000542;
"property_value" = "Mr.";
},
{
"property_id" = 47cc67093475061e01000540;
"property_value" = Male;
}
);
},
{
row = 2;
"row_values" = (
{
"property_id" = 47cc67093475061e01000542;
"property_value" = "Ms.";
},
...
}
}

最佳答案

伙计,“不友好”是对那个阵列的轻描淡写!

好的,我想我明白了:

NSArray *dataRows = @[
@{ @"row" : @"1",
@"row_values" : @[
@{ @"property_id" : @"47cc67093475061e01000542",
@"property_value" : @"Mr." },
@{ @"property_id" : @"47cc67093475061e01000540",
@"property_value" : @"Male" }
]
},
@{ @"row" : @"2",
@"row_values" : @[
@{ @"property_id" : @"47cc67093475061e01000542",
@"property_value" : @"Ms." },
@{ @"property_id" : @"47cc67093475061e01000540",
@"property_value" : @"Female" }
]
}
];

NSPredicate *p = [NSPredicate predicateWithFormat:@"SUBQUERY(row_values, $rv, $rv.property_id = %@ AND $rv.property_value = %@).@count > 0", @"47cc67093475061e01000540", @"Male"];

NSArray *filtered = [dataRows filteredArrayUsingPredicate:p];

那么让我们看看这个谓词在做什么。

  1. 从最外层开始:

    SUBQUERY([stuff]).@count > 0

    SUBQUERY 返回一个对象数组。我们将在 dataRows 数组中的每个 NSDictionary 上运行这个 SUBQUERY,我们想要聚合所有 所在的字典该字典上的 >SUBQUERY 返回东西。所以我们运行 SUBQUERY,然后(因为它返回一个集合)询问其中有多少项 (.@count) 并查看它是否大于0. 如果是,那么顶级字典将在最终过滤的数组中。

  2. 深入SUBQUERY:

    SUBQUERY(row_values, $rv, $rv.property_id = %@ AND $rv.property_value = %@)

    每个 SUBQUERY 都有三个参数:键路径、变量和谓词。关键路径是我们将要迭代的对象的属性。由于 SUBQUERY 是在最外层的字典上计算的,我们将请求该字典的 @"row_values" 并取回一个数组。 SUBQUERY 然后将遍历 row_values 集合中的项目。

    变量就是我们要对集合中的每个项目进行的调用。在这种情况下,它只是 $rv(“行值”的简写)。在我们的例子中,每个 $rv 都将是一个 NSDictionary,因为 row_values“属性”是一个字典数组。

    最后,谓词将被执行,$rv 将依次替换为每个字典。在这种情况下,我们要查看字典是否具有某个property_id 和某个property_value如果是,它将聚合到一个新数组中,这就是将从 SUBQUERY 返回的数组。

    换句话说,SUBQUERY 将构建一个包含所有具有 property_idproperty_value 的 row_values 的数组我们正在寻找的东西。

最后,当我运行这段代码时,我得到:

(
{
row = 1;
"row_values" = (
{
"property_id" = 47cc67093475061e01000542;
"property_value" = "Mr.";
},
{
"property_id" = 47cc67093475061e01000540;
"property_value" = Male;
}
);
}
)

关于iphone - NSPredicate 子查询语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9630237/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com