我正在努力在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'
但它不是我需要的,我无法访问某个部门'例如,每层的属性......我想在这些数组中动态添加数据。
我做错了,我无法弄清楚如何正确行事......
感谢您的帮助!
答案 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的静态类型超集)不同,您无法强制每个寄存器实际拥有一组特定属性。因此,在创建实例时,您必须格外小心,以便从一开始就初始化每个属性。