嵌套结构的动态字段参考

时间:2018-08-07 12:47:36

标签: matlab dynamic struct

在我们的MATLAB代码中,我们经常使用dynamic field references,它们非常棒。我们有许多具有不同字段集的不同数据结构,因此,只需使用struct.('field')表示法,而不必使用eval语句,就可以更轻松地访问其中的任何一个。 / p>

但是,我们遇到问题的地方是这些结构中的许多结构具有多个层次,我们并不总是知道我们需要深入到结构中的深度。理想情况下,我们希望能够不使用eval语句(例如类似

)访问它们
struct.('field.field2.field3')

是否有一种使用内置功能动态访问深度未知的结构的方法?还是我们必须创建一个自定义函数来访问我们的所有结构?

1 个答案:

答案 0 :(得分:3)

此代码适用于以下假设和使用情况:

  1. 您不知道该字段在某些嵌套动态结构中的位置。
  2. 此字段的名称是唯一的,即在结构中的任何地方都没有其他同名字段。

以下功能有效:

"Table1": {
      "Type": "AWS::DynamoDB::Table",
      "DependsOn": [
        "Table2"
      ],
      "Properties": {
        "AttributeDefinitions": [
          {
            "AttributeName": "key",
            "AttributeType": "S"
          }
        ],
        "KeySchema": [
          {
            "AttributeName": "key",
            "KeyType": "HASH"
          }
        ],
        "ProvisionedThroughput": {
          "ReadCapacityUnits": "2",
          "WriteCapacityUnits": "2"
        },
        "TableName": {
          "table1"
        }
      }, 
"Table2": {
      "Type": "AWS::DynamoDB::Table",
      "Properties": {
        "AttributeDefinitions": [
          {
            "AttributeName": "key",
            "AttributeType": "S"
          }
        ],
        "KeySchema": [
          {
            "AttributeName": "key",
            "KeyType": "HASH"
          }
        ],
        "ProvisionedThroughput": {
          "ReadCapacityUnits": "2",
          "WriteCapacityUnits": "2"
        },
        "TableName": {
          "table2"
        }
      }

使用案例:

function [fieldplace]=findfield(s,field)

% is one of these?
fieldplace={};
if (isfield(s,field))
    fieldplace{end+1}=field;
    return;
end

if ~isstruct(s)
    fieldplace={};
    return;
end

% otherwise is nested somewhere, use recursivity.
fnames=fieldnames(s);
for ii=1:numel(fnames)
    fieldplace=findfield(s.(fnames{ii}),field);
    if ~isempty(fieldplace)
        fieldplace=[fnames{ii} fieldplace];
        return;
    end
end


end

您可以按以下方式读取该字段:

s.a=1;
s.b.c=2;
s.b.d=3;
s.e.f.g=4;
s.h.i.j.k=5;
result=findfield(s,'k');