相当于C&C嵌套结构的javascript

时间:2018-03-16 21:44:53

标签: javascript arrays javascript-objects

我正在努力在Javascript中声明和访问嵌套数组中的数据

我可以使用嵌套结构在C中轻松完成,首先声明最低级别的结构,并在声明上层结构时包含它的数组,依此类推。我最终得到一个包含结构数组的结构,每个结构都包含一系列结构......

但到目前为止我只有3天的Javascript经验......

为了帮助您了解我需要如何组织数据,以下是一个示例:

让我们想象一个图书馆,这个图书馆有几个楼层,每个楼层都有相同类型的属性(名称,书籍数量......),每个楼层都有几个部门,每个楼层都有相同类型的属性,每个部门都有几个架子等......

让我们说1楼的名字来自一位着名的数学家,分为两个部门:1 /算术和2 /几何

我的理想是以这种方式处理数据:

library.floor[0].name = 'Fermat'

library.floor[0].department[0].name = 'arithmetics'

library.floor[0].department[1].name = 'geometry'

library.floor[0].department[1].shelve[4].authors = // authors list 
到目前为止,我已经尝试过这个:

var library =

{

floors: [

     {floor_name:'Fermat'},
     {has_a_printing_machine:true},
     {departments:[

        {department_name:'group_theory'},
        {shelves:[

            {shelf_name:'letters_f_z},
            {authors: ["Frobenius","Lagrange"]}]}]}]

};

我可以从以下网站获取数据:

log(library.floors[0].floor_name); // ouputs 'fermat'
log(library.floors[2].departments[0].department_name); // outputs 'group_theory'
log(library.floors[2].departments[1].shelves[1].authors[1]); // outputs 'Lagrange'

但它不是我需要的,我无法访问某个部门'例如,每层的属性......我想在这些数组中动态添加数据。

我做错了,我无法弄清楚如何正确行事......

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

您误解了JavaScript对象文字。它们与C中的结构完全不同.Structs是类型声明,JavaScript对象文字是实际对象

你应该停止为每个对象放置一个键/值对,并开始制作包含相同属性的统一对象。

当您编写[ { department_name: ... }, { shelves: ... } ]时,您正在定义一个包含两个不相关对象的数组,一个包含department_name属性,另一个包含shelves属性。这些对象彼此之间一无所知,或者它们包含在同一个数组中。

而不是......

[
  {
     department_name: 'group_theory'
  },
  {
    shelves: [ 
    {
      shelf_name: 'letters_f_z'
    },
    {
      authors: ["Frobenius","Lagrange"]
    }
  ]
}

你应该写:

{
  departments: [
    { # This entire object is a department. It has a name and shelves
      name: 'group_theory',
      shelves: [
        { # This entire object is a shelf. It has a name and authors.
          name: 'letters_f_z',
          authors: ["Frobenius","Lagrange"],
        }
      ]
    }
  ]
}

以不同的方式,当你写这个......

floors: [
     {floor_name:'Fermat'},
     {has_a_printing_machine:true},
     {departments:[...]}
]

你没有制作一个楼层数组,你正在创建一个包含三个完全不相关的对象的数组,一个包含floor_name属性,一个包含has_a_printing_machine属性,另一个包含departments属性一个floors: [ { name: 'floor_one', has_a_printing_machine: true, departments: [] }, { name: 'floor_two', has_a_printing_machine: false, departments: [ ... ] }, { name: 'floor_three', has_a_printing_machine: true, departments: [] }, ] 财产。如果您希望所有三个对象都具有所有三个属性,则需要以这种方式声明它们:

ol.style.icon

答案 1 :(得分:0)

几乎拥有它。每层楼都是一个独立的实体,具有其特性。其中一个属性是部门列表,每个部门本身也是一个实体(同样,具有自己的属性)。和货架一样。

实体/结构/寄存器的每个实例都是一个字典,其属性映射为key:value对。因此,例如,货架可以是:

var my_shelf = {
  shelf_name:'letters_f_z',
  authors: ["Frobenius","Lagrange"]
};

部门(有货架)可能是:

{
    department_name:'group_theory',
    shelves:[
        {
            shelf_name:'letters_f_z',
            authors: ["Frobenius","Lagrange"]
        }, 
        {...}
    ]
}

我认为此时您可以将此构造推断到楼层,将一系列部门注册表作为departments属性的值。

不幸的是,与TypeScript(它是JavaScript的静态类型超集)不同,您无法强制每个寄存器实际拥有一组特定属性。因此,在创建实例时,您必须格外小心,以便从一开始就初始化每个属性。