gpt4 book ai didi

Delphi SuperObject - 是否有一个(递归)搜索函数可以告诉在哪里可以找到值?

转载 作者:行者123 更新时间:2023-12-02 17:33:48 25 4
gpt4 key购买 nike

我正在使用 SuperObject 创建和操作 JSON 中的简单层次结构。

我的目标是将一组对象 {"id":..., "name":..., "parent":...} 转换为层次结构。示例:

我想改变这个

    {"id": "0001","name": "item0001", "parent":""},
{"id": "0002","name": "item0002", "parent":""},
{"id": "0003","name": "item0003", "parent":""},
{"id": "0003.1","name": "item0003.1", "parent":"0003"},
{"id": "0003.1.1","name": "item0003.1.1", "parent":"0003.1"},

进入此

{
"items": [
{
"id": "0001",
"name": "item0001"
},
{
"id": "0002",
"name": "item0002"
},
{
"id": "0003",
"name": "item0003",
"items": [
{
"id": "0003.1",
"name": "item0003.1",
"items": [
{
"id": "0003.1.1",
"name": "item0003.1.1"
}
]
}
]
}
]
}

(这种结构可以变化,即没有固定的模型。这可能意味着解决方案必须是递归的)。

我认为实现这一目标的方法是:

  • 对于每个要添加的对象,
    • 如果没有父级,请将其添加到输出 json 的顶部;
    • 如果有父级,则查找父级在输出 json 中的位置。
    • 将对象添加到父项下的输出 json 中。

为此,我正在寻找一种方法来检索对象的路径,例如

function findpathinObject(key:string, value:string, object:iSuperObject):string

这将返回找到的值的“路径”。

在我的示例中,findpathinObject("parent", "0003.1", newObject) 将返回 'items[2].items[0]'

这是一个好方法吗?有什么东西可以解决我的问题而不需要创建新功能吗?

我见过的最接近的是这个 SuperObject - Extract All但我不知道是否可以更改它以返回它正在查找的路径,或者它最终找到值的路径...

谢谢

最佳答案

从Python得到这个: Sorting JSON object(s) into a Hierarchy

在 Delphi 中(它有效,这里是指导摘录):

function ProcessObject(const aAsObject: iSuperObject): iSuperObject;
var
var KeyedObject: iSuperObject
item: iSuperObject;
ArrayItem: iSuperObject;
parent, tgt: iSuperObject;
begin
KeyedObject := SO('{}');
for ArrayItem in aAsObject do
begin
KeyedObject[ArrayItem['id'].AsString] := ArrayItem;
end;

// iterate through each item in the `myJson` list.
for item in aAsObject do
begin
// does the item have a parent?
if assigned(item['parent.id']) then
begin
// get the parent item
if (assigned(item['parent']) and assigned(item['parent.id'])) then
begin
if (assigned(KeyedObject[item['parent'].AsString])) then
parent := KeyedObject[item['parent.id'].AsString];
// if the parent item doesn't have a "children" member,
// we must create one.
if not(assigned(parent['children'])) then
parent['children'] := SO('{[]}');
// add the item to its parent's "children" list.
parent['children[]'] := item;
end;
end;
end;

tgt := SO('{}');

for item in aAsObject do
if not assigned(item['parent']) then
tgt[] := item;

result := tgt;
end;

关于Delphi SuperObject - 是否有一个(递归)搜索函数可以告诉在哪里可以找到值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53293565/

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