我从API端点获得了鞋码的JSON响应,如下所示:
data: [{
0: {
system: "US",
sizes: {
7: {B: 3, C: 6, D: 1, E: 1}
7.5: {A: 6, B: 7, C: 14, D: 11, E: 2}
8: {2E: 1, A: 5, B: 32, C: 38, D: 23, …}
8.5: {2E: 2, A: 9, B: 56, C: 79, D: 61, …}
9: {2A: 5, 2E: 4, A: 17, B: 92, C: 143, …}
9.5: {2A: 3, 2E: 3, A: 26, B: 132, C: 194, …}
10: {2A: 5, 2E: 3, 3A: 1, A: 53, B: 159, …}
}
}
}]
数据显示,例如,美国尺码7有四种不同形状(B,C,D,E),其中3人有脚形B.总共有11个人的尺码为7.该列表可以包含尺寸美国,欧盟或不同的系统,形状的关键可以是AZ或基本上任何其他东西。
我想循环遍历sizes
并创建一个图表,显示有多少人具有一定的大小,以及有多少具有该大小的特定形状。
循环这样的对象以获得每个形状的值的最佳方法是什么?我希望它是一个大小的数组。
ES6或ES7很好,但我更喜欢不用jQuery。
编辑: 让我更清楚一点。 首先,我考虑过改进数据结构,但不幸的是,这不是一个选择。
我尝试了Object.keys(sizes)
,它返回了一个键数组。当然,这是向前迈出的一步。但是我想调用一个函数来返回一个带有键及其值的对象。在我看来,返回值应该是这样的:
sizes: [
{
size: 7,
total: 11
shapes: [
{name: 'B', value: 3},
{name: 'C', value: 6},
{name: 'D', value: 1},
{name: 'E', value: 1}
]
},{...},{...}
]
这有意义吗?当然,长度并非绝对必须包含在对象中。
答案 0 :(得分:1)
使用Object.keys()
和.reduce()
对密钥值进行求和。
注意:我必须清理您的数据,并删除级别以简化示例。您需要根据实际数据进行调整。
const data = [
{
system: 'US',
sizes: {
7: {
B: 3,
C: 6,
D: 1,
E: 1,
},
7.5: {
A: 6,
B: 7,
C: 14,
D: 11,
E: 2,
},
8: {
'2E': 1,
A: 5,
B: 32,
C: 38,
D: 23,
},
8.5: {
'2E': 2,
A: 9,
B: 56,
C: 79,
D: 61,
},
9: {
'2A': 5,
'2E': 4,
A: 17,
B: 92,
C: 143,
},
9.5: {
'2A': 3,
'2E': 3,
A: 26,
B: 132,
C: 194,
},
10: {
'2A': 5,
'2E': 3,
'3A': 1,
A: 53,
B: 159,
},
},
},
];
const { // We use destructuration to make a copy
sizes = {} // We assign a default value in case sizes is undefined
} = data[0];
const sumOfSizes = {}; // Future object we will fill
Object.keys(sizes).forEach((sizeIndex) => { // We get the keys of the object, and loop over it.
const size = sizes[sizeIndex]; // For clarity, I assigned the needed value to a var.
const sumOfShapes = Object.keys(size).reduce((prevSum, shapeIndex) => { // We get the sub-keys of the object and sum the values of them.
const shapeValue = size[shapeIndex];
return prevSum + shapeValue;
}, 0);
sumOfSizes[sizeIndex] = sumOfShapes; // We assign the sum of shapes to the current shoe size.
});
console.log(sumOfSizes);
答案 1 :(得分:1)
您可以使用array#map
,Object.keys()
和array#reduce
。
const data = [{system:'US',sizes:{7:{B:3,C:6,D:1,E:1,}, 7.5: { A: 6, B: 7, C: 14, D: 11, E: 2, }, 8: { '2E': 1, A: 5, B: 32, C: 38, D: 23, }, 8.5: { '2E': 2, A: 9, B: 56, C: 79, D: 61, }, 9: { '2A': 5, '2E': 4, A: 17, B: 92, C: 143, }, 9.5: { '2A': 3, '2E': 3, A: 26, B: 132, C: 194, }, 10: { '2A': 5, '2E': 3, '3A': 1, A: 53, B: 159, }, }, }, ];
var result = data.map((obj) => {
return Object.keys(obj.sizes).reduce((arr,k) => {
let res = Object.keys(obj.sizes[k]).reduce((r, k1) => {
r['size'] = k;
r.shapes.push({name: k1, value: obj.sizes[k][k1]});
r.total += obj.sizes[k][k1];
return r;
},{shapes:[],total:0});
arr.push(res);
return arr;
},[]);
})
console.log(result);

.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 2 :(得分:0)