我有这个对象:
var a = {
"1":{"topicId":1,
"subTopicId":1,
"topicName":"x",
"subTopicName":"x"},
"2":{"topicId":1,
"subTopicId":2,
"topicName":"x",
"subTopicName":"x"},
"62":{"topicId":10,
"subTopicId":62,
"topicName":"x",
"subTopicName":"x"}
}
我意识到我可以像这样定义内部对象:
interface IData {
topicId: number;
subTopicId: number;
topicName: string;
subTopicName; string;
}
但有没有办法可以定义可以包含任意数量的IData对象的整个对象?
答案 0 :(得分:1)
如果JSON包含" stringId" (例如" 1"," 2")作为识别器,我们可以将该对象定义为字典(见here ):
interface IData
{
topicId: number;
subTopicId: number;
topicName: string;
subTopicName; string;
}
// IDictionary with a key of type string
// and a value of type IData
interface IDataSet
{
[key: string] : IData;
}
var source =
'{ "1":{"topicId":1, "subTopicId":1, "topicName":"x","subTopicName":"x"},'+
' "2":{"topicId":1, "subTopicId":2, "topicName":"x","subTopicName":"x"},'+
' "62":{"topicId":10,"subTopicId":62,"topicName":"x","subTopicName":"x"}'+
'}';
var a = <IDataSet>JSON.parse(source);
for(var key in a)
{
var elm = document.createElement('div');
elm.innerText = "key: " + key + ", topicId: " + a[key].topicId
document.body.appendChild(elm);
}
选中此code here (点击“运行”,查看结果)
答案 1 :(得分:0)
哎呀,忽略了typescript
标签..通过解析JSON(可能是服务器输出,从配置文件中读取等)来查看替代答案。以下是如何在纯javascript中执行此操作:
在对象中使用数组属性。
然后将每个数组元素设置为IData对象的实例。
var a = { Topics: [] }; // define container with empty Topics array
// add some topics
a.Topics[1] = { topicId: 1, subTopicId: 1, topicName: "x", subTopicName: "x" };
a.Topics[2] = { topicId: 1, subTopicId: 2, topicName: "x", subTopicName: "x" };
a.Topics[62] = { topicId: 10, subTopicId: 62, topicName: "x", subTopicName: "x" };
然后访问这样的对象:
alert(a.Topics[1].topicName + " - " + a.Topics[1].subTopicName);