是否可以定义包含对象的对象?

时间:2014-07-28 16:52:55

标签: javascript typescript

我有这个对象:

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对象的整个对象?

2 个答案:

答案 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);

相关问题