【问题标题】:Is it possible to define an object containing objects?是否可以定义包含对象的对象?
【发布时间】:2014-09-19 22:27:07
【问题描述】:

我有这个对象:

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

【问题讨论】:

  • which can have any number of IData objects: 听起来你想要一个Array

标签: javascript typescript


【解决方案1】:

如果 JSON 包含“stringId”(例如“1”,“2”) 作为标识符,我们可以将该对象定义为字典 (参见 @987654321 @):

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(点击运行,查看结果)

【讨论】:

    【解决方案2】:

    哎呀,忽略了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);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-27
      • 2020-06-07
      • 2019-03-31
      • 1970-01-01
      相关资源
      最近更新 更多