如何在JavaScript中使用map reduce来汇总多层嵌套对象中的信息?

问题描述 投票:0回答:1

我正在尝试编写一个函数,该函数将有效地汇总来自一系列嵌套javascript对象的数据。我相信这应该可以通过reduce方法实现,但是我对使用reduce并不是很熟练,几乎所有我可以找到的示例都使用嵌套数组或数组和对象的某种组合,而我的数据却只是一系列而已。嵌套对象(比我能找到的示例更深层的嵌套。

这是我的原始数据:

var activity = {
    "Network": {
      "ID": "Network",
      "MLS": {
        "ID": "MLS",
        "Ports": {
          "ID": "Ports",
          "GigabitEthernet0/1": {
            "ID": "GigabitEthernet0/1",
            "Port Mode": {
              "ID": "Port Mode",
              "Name": "Port Mode",
              "Value": "0",
              "PointsPossible": 1,
              "PointsEarned": 1,
              "ComparatorClass": 8
            },
            "Native VLAN": {
              "ID": "Native VLAN",
              "Name": "Native VLAN",
              "Value": "99",
              "PointsPossible": 1,
              "PointsEarned": 1,
              "ComparatorClass": 5
            }
          },
          "GigabitEthernet0/2": {
            "ID": "GigabitEthernet0/2",
            "IP Address": {
              "ID": "IP Address",
              "Name": "IP Address",
              "Value": "209.165.200.225",
              "PointsPossible": 1,
              "PointsEarned": 1,
              "ComparatorClass": 0
            },
            "Subnet Mask": {
              "ID": "Subnet Mask",
              "Name": "Subnet Mask",
              "Value": "255.255.255.252",
              "PointsPossible": 1,
              "PointsEarned": 1,
              "ComparatorClass": 0
            },
            "(deprecated) IPv6 Addresses": {
              "ID": "Ipv6 Address",
              "2001:DB8:ACAD:A::1": {
                "ID": "2001:DB8:ACAD:A::1",
                "IP Address": {
                  "ID": "IP Address",
                  "Name": "IP Address",
                  "Value": "2001:DB8:ACAD:A::1",
                  "PointsPossible": 1,
                  "PointsEarned": 1,
                  "ComparatorClass": 0
                },
                "Prefix Length": {
                  "ID": "Prefix",
                  "Name": "Prefix Length",
                  "Value": "64",
                  "PointsPossible": 1,
                  "PointsEarned": 1,
                  "ComparatorClass": 0
                }
              }
            },
            "SwitchPort": {
              "ID": "SwitchPort",
              "Name": "SwitchPort",
              "Value": "0",
              "PointsPossible": 1,
              "PointsEarned": 1,
              "ComparatorClass": 8
            }
          },
          "Vlan10": {
            "ID": "Vlan10",
            "IP Address": {
              "ID": "IP Address",
              "Name": "IP Address",
              "Value": "192.168.10.254",
              "PointsPossible": 2,
              "PointsEarned": 2,
              "ComparatorClass": 0
            },
            "(deprecated) IPv6 Addresses": {
              "ID": "Ipv6 Address",
              "2001:DB8:ACAD:10::1": {
                "ID": "2001:DB8:ACAD:10::1",
                "IP Address": {
                  "ID": "IP Address",
                  "Name": "IP Address",
                  "Value": "2001:DB8:ACAD:10::1",
                  "PointsPossible": 1,
                  "PointsEarned": 1,
                  "ComparatorClass": 0
                },
                "Prefix Length": {
                  "ID": "Prefix",
                  "Name": "Prefix Length",
                  "Value": "64",
                  "PointsPossible": 1,
                  "PointsEarned": 1,
                  "ComparatorClass": 0
                }
              }
            }
          },
          "Vlan20": {
            "ID": "Vlan20",
            "IP Address": {
              "ID": "IP Address",
              "Name": "IP Address",
              "Value": "192.168.20.254",
              "PointsPossible": 1,
              "PointsEarned": 1,
              "ComparatorClass": 0
            },
            "(deprecated) IPv6 Addresses": {
              "ID": "Ipv6 Address",
              "2001:DB8:ACAD:20::1": {
                "ID": "2001:DB8:ACAD:20::1",
                "IP Address": {
                  "ID": "IP Address",
                  "Name": "IP Address",
                  "Value": "2001:DB8:ACAD:20::1",
                  "PointsPossible": 1,
                  "PointsEarned": 1,
                  "ComparatorClass": 0
                },
                "Prefix Length": {
                  "ID": "Prefix",
                  "Name": "Prefix Length",
                  "Value": "64",
                  "PointsPossible": 1,
                  "PointsEarned": 1,
                  "ComparatorClass": 0
                }
              }
            }
          },
          "Vlan30": {
            "ID": "Vlan30",
            "IP Address": {
              "ID": "IP Address",
              "Name": "IP Address",
              "Value": "192.168.30.254",
              "PointsPossible": 1,
              "PointsEarned": 1,
              "ComparatorClass": 0
            },
            "(deprecated) IPv6 Addresses": {
              "ID": "Ipv6 Address",
              "2001:DB8:ACAD:30::1": {
                "ID": "2001:DB8:ACAD:30::1",
                "IP Address": {
                  "ID": "IP Address",
                  "Name": "IP Address",
                  "Value": "2001:DB8:ACAD:30::1",
                  "PointsPossible": 1,
                  "PointsEarned": 1,
                  "ComparatorClass": 0
                },
                "Prefix Length": {
                  "ID": "Prefix",
                  "Name": "Prefix Length",
                  "Value": "64",
                  "PointsPossible": 1,
                  "PointsEarned": 1,
                  "ComparatorClass": 0
                }
              }
            }
          },
          "Vlan99": {
            "ID": "Vlan99",
            "IP Address": {
              "ID": "IP Address",
              "Name": "IP Address",
              "Value": "192.168.99.254",
              "PointsPossible": 1,
              "PointsEarned": 1,
              "ComparatorClass": 0
            }
          }
        },
        "Routes": {
          "ID": "Routes",
          "Static Routes": {
            "ID": "Static RoutesV2",
            "Name": "Static Routes",
            "Value": "",
            "PointsPossible": 0,
            "PointsEarned": 0,
            "ComparatorClass": 1
          },
          "IP Routing": {
            "ID": "IP Routing",
            "Name": "IP Routing",
            "Value": "1",
            "PointsPossible": 1,
            "PointsEarned": 1,
            "ComparatorClass": 1
          }
        },
        "Routesv6": {
          "ID": "Routesv6",
          "IPv6 Unicast Routing": {
            "ID": "Ipv6 Unicast Routing",
            "Name": "IPv6 Unicast Routing",
            "Value": "1",
            "PointsPossible": 1,
            "PointsEarned": 1,
            "ComparatorClass": 1
          }
        },
        "VLANS": {
          "ID": "VLANS",
          "VLAN 10": {
            "ID": "10",
            "VLAN Name": {
              "ID": "VLAN Name",
              "Name": "VLAN Name",
              "Value": "Staff",
              "PointsPossible": 1,
              "PointsEarned": 1,
              "ComparatorClass": 5
            }
          },
          "VLAN 20": {
            "ID": "20",
            "VLAN Name": {
              "ID": "VLAN Name",
              "Name": "VLAN Name",
              "Value": "Student",
              "PointsPossible": 1,
              "PointsEarned": 1,
              "ComparatorClass": 5
            }
          },
          "VLAN 30": {
            "ID": "30",
            "VLAN Name": {
              "ID": "VLAN Name",
              "Name": "VLAN Name",
              "Value": "Faculty",
              "PointsPossible": 1,
              "PointsEarned": 1,
              "ComparatorClass": 5
            }
          }
        }
      },
      "S1": {
        "ID": "S1",
        "Ports": {
          "ID": "Ports",
          "GigabitEthernet0/1": {
            "ID": "GigabitEthernet0/1",
            "Port Mode": {
              "ID": "Port Mode",
              "Name": "Port Mode",
              "Value": "0",
              "PointsPossible": 1,
              "PointsEarned": 1,
              "ComparatorClass": 8
            },
            "Native VLAN": {
              "ID": "Native VLAN",
              "Name": "Native VLAN",
              "Value": "99",
              "PointsPossible": 2,
              "PointsEarned": 1,
              "ComparatorClass": 5
            }
          }
        }
      }
    }
  };

我希望汇总数据(totalPointsEarned,totalPointsPossible,totalItemsPossible,totalItemsComplete)以及每个“ ComparatorClass”的数据,尽管应该按名称存储而不是按数字存储。从ComparatorClass数字到名称的映射如下:

    var comparatorClassIdToNameMap = {
        0:"Ip",
        1:"Routing",
        2:"Acl",
        3:"Nat",
        4:"Physical",
        5:"Switching",
        6:"Connectivity",
        7:"Logical",
        8:"All",
        9:"Encircling_Head",
        10:"Encircling_All"
    };

所以最终结果应如下所示:

{
  "totalPointsEarned": 25,
  "totalPointsPossible": 26,
  "totalItemsComplete": 24,
  "totalItemsPossible": 24,
  "Ip": {
    "pointsEarned": 7,
    "pointsPossible": 7,
    "itemsComplete": 6,
    "itemsPossible": 6,
    "ComparatorClassID": 0
  },
  "Routing": {
    "pointsEarned": 2,
    "pointsPossible": 2,
    "itemsComplete": 2,
    "itemsPossible": 2,
    "ComparatorClassID": 1
  },
  "Acl": {
    "pointsEarned": 0,
    "pointsPossible": 0,
    "itemsComplete": 0,
    "itemsPossible": 0,
    "ComparatorClassID": 2
  },
  "Nat": {
    "pointsEarned": 0,
    "pointsPossible": 0,
    "itemsComplete": 0,
    "itemsPossible": 0,
    "ComparatorClassID": 3
  },
  "Physical": {
    "pointsEarned": 0,
    "pointsPossible": 0,
    "itemsComplete": 0,
    "itemsPossible": 0,
    "ComparatorClassID": 4
  },
  "Switching": {
    "pointsEarned": 5,
    "pointsPossible": 6,
    "itemsComplete": 5,
    "itemsPossible": 5,
    "ComparatorClassID": 5
  },
  "Connectivity": {
    "pointsEarned": 0,
    "pointsPossible": 0,
    "itemsComplete": 0,
    "itemsPossible": 0,
    "ComparatorClassID": 6
  },
  "Logical": {
    "pointsEarned": 0,
    "pointsPossible": 0,
    "itemsComplete": 0,
    "itemsPossible": 0,
    "ComparatorClassID": 7
  },
  "All": {
    "pointsEarned": 0,
    "pointsPossible": 0,
    "itemsComplete": 0,
    "itemsPossible": 0,
    "ComparatorClassID": 8
  },
  "Encircling_Head": {
    "pointsEarned": 0,
    "pointsPossible": 0,
    "itemsComplete": 0,
    "itemsPossible": 0,
    "ComparatorClassID": 9
  },
  "Encircling_All": {
    "pointsEarned": 0,
    "pointsPossible": 0,
    "itemsComplete": 0,
    "itemsPossible": 0,
    "ComparatorClassID": 10
  }
}

pointsEarned / pointsPossible只是从原始数据中求和,itemsComplete是具有> 0 pointsEarned的每个叶子的计数,itemsPossible是具有> 0 pointsPossible的每个叶子的计数。

在我如何使用reduce来有效地计算这些值(或某些其他方法)方面的任何帮助,将不胜感激。我可以通过一系列的for / ifs来解决这个问题,但这似乎效率很低。

谢谢!

javascript object mapreduce
1个回答
0
投票

这绝对不是很好(5个嵌套的forEach循环),需要清理。但基本前提是存在的,应该可以让您到达需要去的地方。

© www.soinside.com 2019 - 2024. All rights reserved.