首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用JS编辑JSON数据结构

使用JS编辑JSON数据结构
EN

Stack Overflow用户
提问于 2016-06-03 06:16:03
回答 2查看 112关注 0票数 1

原始JSON文件:

代码语言:javascript
运行
复制
{
"data": {
    "count_at_hub": [
        {
            "hub": "A",
            "date": "",
            "size": "1",
            "count": 141
        },
        {
            "hub": "A",
            "date": "",
            "size": "2",
            "count": 44
        },
        {
            "hub": "A",
            "date": "",
            "size": "3",
            "count": 3
        },
        {
            "hub": "A",
            "date": "",
            "size": "0",
            "count": 1446
        },
        {
            "hub": "B",
            "date": "",
            "size": "1",
            "count": 202
        },
        {
            "hub": "B",
            "date": "",
            "size": "0",
            "count": 2082
        },
        {
            "hub": "B",
            "date": "",
            "size": "3",
            "count": 11
        },
        {
            "hub": "B",
            "date": "",
            "size": "2",
            "count": 53
        }
    ],
    "Part B":[
        {

        }
    ]
},
"success": true,
"errors": [],
"e": {}}

我想把结构改为:

代码语言:javascript
运行
复制
{
"data": {
    "count_at_hub": [
        {
            "hub": "A",
            "date": "",
            "size1": 141,
            "size2": 44,
            "size3": 3,
            "size4": 1446
        },

        {
            "hub": "B",
            "date": "",
            "size1": 202,
            "size2": 2082,
            "size3": 11,
            "count": 53
        }
    ],
    "Part B":[
        {

        }
    ]
},
"success": true,
"errors": [],
"e": {}}

基本上,我想把同一个集线器的所有计数放在同一个数组下面。我该怎么做呢?

就海量数据而言,将JSON更改为新文件是否会使加载速度比让JS遍历原始文件以构建仪表板更长?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-06-03 06:27:58

您可以迭代一个对象并将其作为结果数组的引用。

size": "0"的元素转到size4

代码语言:javascript
运行
复制
var object = { "data": { "count_at_hub": [{ "hub": "A", "date": "", "size": "1", "count": 141 }, { "hub": "A", "date": "", "size": "2", "count": 44 }, { "hub": "A", "date": "", "size": "3", "count": 3 }, { "hub": "A", "date": "", "size": "0", "count": 1446 }, { "hub": "B", "date": "", "size": "1", "count": 202 }, { "hub": "B", "date": "", "size": "0", "count": 2082 }, { "hub": "B", "date": "", "size": "3", "count": 11 }, { "hub": "B", "date": "", "size": "2", "count": 53 }], "Part B": [{}] }, "success": true, "errors": [], "e": {} },
    temp = [];

object.data.count_at_hub.forEach(function (a) {
    if (!this[a.hub]) {
        this[a.hub] = { hub: a.hub, date: a.date, size1: 0, size2: 0, size3: 0, size4: 0 };
        temp.push(this[a.hub]);
    }
    this[a.hub]['size' + (+a.size || 4)] += a.count;
}, Object.create(null));

object.data.count_at_hub = temp;

console.log(object);

票数 2
EN

Stack Overflow用户

发布于 2016-06-03 09:03:53

嗨,这是我的答案,根据我的建议,大小数组中的每个size.count位于与大小值相对应的索引上。也就是说,size: 0 count : 2082[2082,,,]一样放置在数组中。要访问大小和计数,您可以像count = sizes[size]那样做,代码如下;

代码语言:javascript
运行
复制
var cag =  [
        {
            "hub": "A",
            "date": "",
            "size": "1",
            "count": 141
        },
        {
            "hub": "A",
            "date": "",
            "size": "2",
            "count": 44
        },
        {
            "hub": "A",
            "date": "",
            "size": "3",
            "count": 3
        },
        {
            "hub": "A",
            "date": "",
            "size": "0",
            "count": 1446
        },
        {
            "hub": "B",
            "date": "",
            "size": "1",
            "count": 202
        },
        {
            "hub": "B",
            "date": "",
            "size": "0",
            "count": 2082
        },
        {
            "hub": "B",
            "date": "",
            "size": "3",
            "count": 11
        },
        {
            "hub": "B",
            "date": "",
            "size": "2",
            "count": 53
        }
    ],
   reduced = cag.reduce((p,c) => (p[c.hub] ? p[c.hub].sizes[c.size] = c.count
                                           : p[c.hub] = {  "hub": c.hub,
                                                          "date": c.date,
                                                         "sizes": (new Array(c.size*1)).concat(c.count)},
                                  p),{}),
    result = Object.keys(reduced).map(k => reduced[k]);
    console.log(result);

我首先构造一个简化的对象,这个对象也可以用于您的目的,但随后我将这个对象映射到一个数组中,以便数据位于对象数组中。您可以使用您最喜欢的任何形式的数据。

稍微令人困惑的部分可能是(new Array(c.size*1)).concat(c.count)指令。在那里,我们正在创建一个新的对象(通过对象文本),我们必须启动一个稀疏大小数组,其中只有一个值插入到由size值指定的索引位置。因此,我们构造了一个大小为(new Array(c.size*1))的新数组,但是c.size值是字符串类型的。如果我们确实喜欢new Array("2"),那么我们将在索引0处接收一个带有一个字符串项("2")的数组。但我们需要一个大小为2的数组。这就是为什么我们通过"2"*1操作将字符串"2“转换为数字2的原因(乘法运算符类型强制字符串转换为数字)。因此,我们收到了一个大小为2的空数组。现在是concat操作,它将大小值附加到结果数组中正确的索引位置。

本质上是以下两个指令的统一

代码语言:javascript
运行
复制
    var sizes = [];
sizes[c.size] = c.count;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37607174

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档