是否可以定义一个包含对象的对象

Is it possible to define an object containing objects?

本文关键字:对象 一个 包含 定义 是否      更新时间:2023-09-26

我有这个对象:

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对象?

在这种情况下,JSON包含"stringId" (例如:"1", "2")作为标识符,我们可以将该对象定义为字典(见这里):

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);
}

检查这里的代码(点击运行,查看结果)

哎呀,忽略了typescript标签…请参阅通过解析JSON(可以由服务器输出,从配置文件读取等)解析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);