0

我有一个从 csv 转换而来的 JSON 文件,并且太大而无法手动编辑。我认为它的语法是一个大数组。数据来自一组路由器,我的目标是构建路由器对象。当前 CSV 到 JSON 文件的方式是按每一行组织的,我想挑选出每个路由器并拥有一个带有路由器名称的对象,即与该路由器相关的所有带宽测量值。

你会如何处理这个问题?当我遍历 JSON 文件并且路由器更改时,我试图处理所有这些,我启动路由器对象的新实例。我不再是一个新手,只是一个学习缓慢的人。那么下一步是使用 js 创建一个路由器类,并用我从巨大的 JSON 数组中提取的内容填充该类,还是可以/应该不使用手写类并动态创建所有对象?(我可以即时创建对象吗?

当前的 JSON(它继续用于页面,每个路由器在 csv 中有几百个条目:

[
   {
        "Router": "RouterID1",
        "TimeStamp": "2012/01/01 06:00:00",
        "transferBytes": "23235",
        "ReceivedBytes":  "29903"
   },
   {
        "Router": "RouterID1",
        "TimeStamp": "2012/01/01 06:05:00",
        "transferBytes": "21235",
        "ReceivedBytes":  "22103"
   }
   {
        "Router": "RouterID2",
        "TimeStamp": "2012/01/01 06:00:00",
        "transferBytes": "23235",
        "ReceivedBytes":  "29903"
   },
   {
        "Router": "RouterID2",
        "TimeStamp": "2012/01/01 06:05:00",
        "transferBytes": "21235",
        "ReceivedBytes":  "22103"
   }
]

@amnotiam:路由器类型保证彼此相邻

这可能无效,但这是我认为我要的结构:

[
   {
        "Router": "RouterID1"
        "TimeStamp": array of timestamps
        "transferBytes": array of bytes transferred for each timestamp
        "ReceivedBytes":  array of bytes received for each timestamp
   },
   {
        "Router": "RouterID2",
         "TimeStamp": array of timestamps
        "transferBytes": array of bytes transferred for each timestamp
        "ReceivedBytes":  array of bytes received for each timestamp
   }
]

@Bergi我想为每个路由器创建一个对象,其中包含对象中包含的历史数据。知道我每次进入都有一个对象。(我认为)

@Rick 好电话,我会并且可能会在以后问这个问题:)

4

3 回答 3

1

您真的可以即时创建对象。硬编码一组路由器对象不会更快,而且你很可能会因手写而出错。

看看这个:http: //jsfiddle.net/aSbm6/

于 2012-04-11T14:51:14.483 回答
1

我将从将 json 转换为 php 变量开始,以便您可以更轻松地对其进行操作。看起来你的 Json 是一大堆对象,所以它看起来像这样:

$routerArray = json_decode($yourJsonString);

然后您可以迭代并获取数据:

$newRouterObjectsArray = array();

foreach($routerArray as $routerObject) {
    if (empty($newRouterObjectsArray[$Router])) {
        // instantiate new router here:
        $newRouterObjectsArray[$Router] = new Router([params]);
    }
    // any other logic, assuming that the router does exist
}

如果您直接在 javascript 中执行此操作,它看起来像:

var routerArray = JSON.parse([yourJsonString]);
var newRouterObjects = {};

for (routerEntry in routerArray) {
    if ('undefined' == typeof newRouterObjects[routerEntry->Router]) {
        //if this router doesn't exist yet, create it
        newRouterObjects[routerEntry->Router] = new Router([params]);
    }
    // update totals, etc.
}
于 2012-04-11T15:01:44.623 回答
1

JSON.parse- 或您的库的等效项 - 如果给定您的 JSON 文件,将返回一个对象数组,因此您不需要创建对象。

如果我们data在您的示例中调用 JSON 字符串,则:

var routers = JSON.parse(data);
routers[0].Router === "DWG-350"; // true
routers[1].TimeStamp === "2012/01/01 06:05:00"; // true

routers[0].Router === routers[1].Router; // true
routers[0].TimeStamp === routers[1].TimeStamp; // false

如果您需要进行逻辑或过滤,那么您可以将其中的所有对象routers用作 Javascript 对象,因为它们是。

不过,目前尚不清楚您要做什么。

我认为这是您想要的逻辑:

var routers = JSON.parse(data), // or jQuery.parseJSON()
    aggregate = {};


for (var i = 0, max = routers.length;
     i < max;
     i++) {

     var router = routers[i];
     if (typeof aggregate[routers[i].Router] === 'undefined') {
         aggregate[router['Router']] = {"TimeStamp": [],
                                         "ReceivedBytes": []}
                                         "TransferredBytes": []};

     }

     aggregate[router['Router']]["TimeStamp"]
         .push(router['TimeStamp']);
     aggregate[router['Router']]["ReceivedBytes"]
         .push(router['ReceivedBytes']);
     aggregate[router['Router']]["TransferredBytes"]
         .push(router['TransferredBytes']);
 }
于 2012-04-11T15:09:40.210 回答