使用变量访问嵌套的Javascript对象

时间:2015-03-24 03:06:54

标签: javascript

我试图找到每个通道的总和来获得energy_ac的总能量。这是映射。

var mappings = [
{
  floor: 13,
  name: 1301,
  room_type: 'room',
  energy_ac: [
    {deviceId: 15062, channels: ['ct1']},
    {deviceId: 15063, channels: ['ct1', 'ct2', 'ct3']}
  ],
  energy_light: [
    {deviceId: 15062, channels: ['ct4']}
  ],
  energy_socket1: [
    {deviceId: 15062, channels: ['ct5']}
  ],
  energy_socket2: [
    {deviceId: 15062, channels: ['ct5']}
  ]
}  ];

这是数据:

data = { '15062':
   { _id: 550fea1b46758f1505dd70c7,
 deviceId: '15062',
 link: 'http://egauge15062.egaug.es/cgi-bin/egauge-show?S&s=0&n=6&C&Z=LST-8',
 timestamp: 1427106327,
 ct1: 34,
 ct2: 0,
 ct3: 7,
 ct4: 572,
 ct5: 527 },
  '15063':
   { _id: 550fea1b46758f1505dd70c8,
 deviceId: '15063',
 link: 'http://egauge15062.egaug.es/cgi-bin/egauge-show?S&s=0&n=6&C&Z=LST-8',
 timestamp: 1427106327,
 ct1: 34,
 ct2: 0,
 ct3: 7,
 ct4: 572,
 ct5: 527 },
  '15064':
{ _id: 550fea1b46758f1505dd70c9,
 deviceId: '15064',
 link: 'http://egauge15062.egaug.es/cgi-bin/egauge-show?S&s=0&n=6&C&Z=LST-8',
 timestamp: 1427106327,
 ct1: 34,
 ct2: 0,
 ct3: 7,
 ct4: 572,
 ct5: 527 },
  '15065':
   { _id: 550fea1b46758f1505dd70ca,
 deviceId: '15065',
 link: 'http://egauge15062.egaug.es/cgi-bin/egauge-show?S&s=0&n=6&C&Z=LST-8',
 timestamp: 1427106327,
 ct1: 34,
 ct2: 0,
 ct3: 7,
 ct4: 572,
 ct5: 527 } }

这是我的代码:

mappings.forEach(function(room) {
  var hash = {};
  hash.floor = room.floor;
  hash.name = room.name;
  hash.room_type = room.room_type;
  hash.energy_ac = 0;
  room.energy_ac.forEach(function(device) {
    device.channels.forEach(function(channel){
      hash.energy_ac += room[device][channel];
    });
  });

房间[设备] [频道]对我不起作用。我也试过房间[设备] .channel。我不确定如何获得频道的价值。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

设备嵌套在energy_ac中,因此您无法直接从房间访问它。您需要执行room.energy_ac[device].channels[channel]之类的操作。这仍然无法正常工作,因为通道不是数组的索引,它是当前项目,即通道值。您真正需要做的就是运行hash.energy_ac += channel,因为频道是您想要添加的号码。

答案 1 :(得分:1)

我认为这里的主要问题是你试图从device对象中获取能量,当它实际存储在data对象中时。您需要索引到data对象的存储在device中。

假设您想要每个房间的总energy_ac,您需要做的是:

for each room:
    set hash.energy_ac = 0
    for each device in room's energy_ac:
        for each channel in this device:
          add the energy of this device and channel to hash.energy_ac

因此,对于mappings(1301)中的一个房间,energy_ac应为75.其energy_ac由设备15062组成:频道ct1(34),以及设备15063:通道ct1(34)+ ct2(0)+ ct3(7)。 34 + 34 + 7 = 75。

这是一个JSFiddle(我认为是)你想要的实现。

此外,由于_id值不是字符串,我收到了控制台错误。