有一个可能由任何组成的术语,例如orddicts,orddicts列表,orddicts orddicts orddicts,列表,orddicts的支持者或......如:
Term1 = [
{"AAA", [
{ "K1", "ka1" },
{ "K2", "ka2" },
{ "K3", "ka3" }
]
},
{"BBB","one"},
{"CCC", [
{ "K1", "kb1" },
{ "K2", "" },
{ "K3", "kb3" }
]
},
{"DDD", [
[
{ "K1", "kc1" },
{ "K2", "kc2" }
],
[
{ "K1", "kd1" },
{ "K2", "kd2" }
],
"CACETA",
123
]
},
{"EEE", [
{ "K1", "kb1" },
{ "K2", 1122 },
{ "K3", "kb3" }
]
},
{ "T1", "T2", "T3" },
123,
{ "X" },
[ 1, 2, 3, { "K5", "V5" } ]
],
我需要制作所有支持者列表[{K,V},...] ,例如
[
{ "AAA" , [ ...... ] },
{ "K1" , "ka1" },
{ "K2" , "ka2" },
...
{ "BBB" ,"one"},
{ "CCC" , [ ... ] },
{ "K1" , "kb1" },
...
{ "K5", "V5" }
]
请注意,必须在列表中重复键,其值可以是字符串,列表,tupple或数字,等等。
上例中数据中的最后一项,例如{“T1”,“T2”,“T3”}不应该在结果中,因为它不是两个术语的列表{K, V},但嵌套的 {“K5”,“V5”} 是并且应该是结果的一部分。
我看着这个类似的solution并尝试稍微调整一下,但是我的新手erlang大脑很难让它与上面的场景一起工作。
以下是我尝试使用它的示例,但有一些错误,模式匹配相关:
extractPropList( [], ResultList ) -> ResultList;
extractPropList( [H|T], ResultList ) -> extractPropList(T, extractPropList(H, ResultList));
extractPropList( {K,V}, ResultList ) -> [ {K,V} | extractPropList(K, extractPropList(V, ResultList)) ].
答案 0 :(得分:1)
在测试上述方法时,缺少的部分是处理没有其他匹配项的最后一行(不是列表,而不是{K,V}):
extractPropLists( [], ResultList ) -> ResultList;
extractPropLists( [H|T], ResultList ) -> extractPropLists(T, extractPropLists(H, ResultList));
extractPropLists( {K,V}, ResultList ) -> [ {K,V} | extractPropLists(K, extractPropLists(V, ResultList)) ];
extractPropLists( T, ResultList ) -> ResultList.
鉴于数据与avove相似,我获得的结果
[{"EEE",[{"K1","kb1"},{"K2",1122},{"K3","kb3"}]},
{"K3","kb3"},
{"K2",1122},
{"K1","kb1"},
{"DDD",
[[{"K1","kc1"},{"K2","kc2"}],
[{"K1","kd1"},{"K2","kd2"}],
"CACETA",123]},
{"K2","kd2"},
{"K1","kd1"},
{"K2","kc2"},
{"K1","kc1"},
{"CCC",[{"K1","kb1"},{"K2","kb2"},{"K3","kb3"}]},
{"K3","kb3"},
{"K2","kb2"},
{"K1","kb1"},
{"BBB","one"},
{"AAA",[{"K1","ka1"},{"K2","ka2"},{"K3","ka3"}]},
{"K3","ka3"},
{"K2","ka2"},
{"K1","ka1"}]