在我们的MATLAB代码中,我们经常使用dynamic field references,它们非常棒。我们有许多具有不同字段集的不同数据结构,因此,只需使用struct.('field')
表示法,而不必使用eval
语句,就可以更轻松地访问其中的任何一个。 / p>
但是,我们遇到问题的地方是这些结构中的许多结构具有多个层次,我们并不总是知道我们需要深入到结构中的深度。理想情况下,我们希望能够不使用eval
语句(例如类似
struct.('field.field2.field3')
是否有一种使用内置功能动态访问深度未知的结构的方法?还是我们必须创建一个自定义函数来访问我们的所有结构?
答案 0 :(得分:3)
此代码适用于以下假设和使用情况:
以下功能有效:
"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');