如何访问 javascript 中的多重嵌套子对象?

How can I access multiply nested sub objects in javascript?

我有一个更大的代码来处理和排序数据。在其中,我想使用对象来保持它更容易和更好的结构。我有多个类别,它们都有不同的嵌套子对象,我无法访问这些子对象 writing/reading。 我在网上搜索了 w3schools 但没有找到我的错误,很抱歉这个入门级的问题!

我写了一个测试函数来更好地理解对象!

function test(){
  var report, time, name, date, value;
  report = 'Income Statement';
  time = 'Annually';
  name = 'Revenue';
  date = '2017';
  value = '10000000';
  data = {}
  data[report] = {}
  data[report][time] = {}
  data[report][time][name] = {}
  data[report][time][name][date] = value;
  console.log(data);
}

根据我的理解,这段代码的作用是: -创建一个空对象数据 - 创建一个空的子对象报告 - 创建一个空的子子对象时间 - 创建一个空的 subsubsubobject 名称 - 给 subsubsubobject 名称一个 key/value 对 date:value (至少那是我的意图)

首先我尝试跳过创建空对象并直接填充数据{}: 数据 = {} 数据[报告][时间][名称][日期] = 值;但他似乎无法为此设置属性。 所以我像上面那样为所有子类别创建了编码的第一个空子对象,这真的有必要,还是我犯了一个简单的语法错误?

但是他仍然没有记录我想要的输出:

{ 'Income Statement': { Annually: { Revenue: {2017:10000000} } } }

而是给我:

{ 'Income Statement': { Annually: { Revenue: [Object] } } }

简单地说..我做错了什么? :D

提前感谢您提供的任何帮助! 最好的问候

正确!!我在控制台收到 { Income Statement: { Annually: { Revenue: {2017:10000000} } } } 作为你给定代码的输出。

您是否正在尝试使用 test() 将该数据保存在某个变量中?? 如果是,那么您需要在函数测试定义的末尾使用 return data 而不是 consol.log(data).

我不认为你做错了什么。我在 JS 控制台中粘贴了相同的代码,它给出了正确的结果。

Screenshot of console with result of function

初始化对象的不同方式

  • 静态数据

let data = {
  'Income Statement': {
    'Annually': {
      'Revenue': {
        '2017': '10000000'
      }
    }
  }
}

document.querySelector("#data-result").innerHTML = JSON.stringify(data)
<div id="data-result"></div>

  • 动态数据

var report, time, name, date, value;
report = 'Income Statement';
time = 'Annually';
name = 'Revenue';
date = '2017';
value = '10000000';

let data = {
  [report]: {
    [time]: {
      [name]: {
        [date]: value
      }
    }
  }
}

document.querySelector("#object-result").innerHTML = JSON.stringify(data)
<div id="object-result"></div>

您还可以考虑不同的方式来存储相同的数据。

例子-

let data = [{
  report: 'Income Statement'
  time: 'Annually'
  name: 'Revenue'
  date: '2017'
  value: '10000000'
}]

所以现在,如果您希望将来按日期显示数据,您可以使用过滤器

let data_2017 = data.filter(x => x.date === '2017');