原始JSON文件:
{
"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": {}}
我想将结构更改为:
{
"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": {}}
基本上,我想将同一个集线器的所有计数放在同一个数组下。我该怎么做呢?
就大量数据而言,与将JS循环通过原始文件构建仪表板相比,将JSON更改为新文件会使加载速度更长吗?
答案 0 :(得分:2)
您可以迭代并获取对象作为结果数组的引用。
size": "0"
的元素转到size4
。
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);

答案 1 :(得分:1)
嗨,这是我的答案,根据我的建议使用sizes数组,其中每个size.count都位于与size值对应的索引处。即size: 0 count : 2082
被放置在数组中[2082,,,]
。要访问大小和计数,您可以执行count = sizes[size]
代码如下;
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"通过" 2" * 1运算(乘法运算符类型将字符串强制转换为数字)。所以我们收到一个大小为2的空数组。现在是concat操作,它将我们的size值附加到结果数组中的正确索引位置。
它基本上是以下两条指令的统一
var sizes = [];
sizes[c.size] = c.count;