Javascript 如何在具有未知键和值的对象上循环

Javascript 如何在具有未知键和值的对象上循环,javascript,json,Javascript,Json,我从一个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:

我从一个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, …}
        }
    }
}]
sizes: [
    {
        size: 7,
        total: 11
        shapes: [
            {name: 'B', value: 3},
            {name: 'C', value: 6},
            {name: 'D', value: 1},
            {name: 'E', value: 1}
        ]
    },{...},{...}
]
数据显示,例如,美国7号尺码有四种不同的形状(B、C、D、e),其中3人的脚形状为B。总共有11人的脚形状为7号尺码。该列表可以包含美国、欧盟或不同系统中的尺寸,形状的键可以是A-Z或基本上其他任何形状

我想循环查看
大小
并创建一个图表,显示有多少人具有特定大小,以及有多少人具有该大小的特定形状

在这样的对象上循环以获得每个形状的值的最佳方法是什么?我希望它是一个大小数组

ES6或ES7很好,但我更喜欢不使用jQuery

编辑: 让我更清楚一点。 首先,我考虑过改进数据结构,但不幸的是,这不是一个选项

我尝试了返回一个键数组的
Object.keys(size)
。当然,这是向前迈出的一步。但我想调用一个函数,它返回一个带有键及其值的对象。在我看来,返回值应该是这样的:

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, …}
        }
    }
}]
sizes: [
    {
        size: 7,
        total: 11
        shapes: [
            {name: 'B', value: 3},
            {name: 'C', value: 6},
            {name: 'D', value: 1},
            {name: 'E', value: 1}
        ]
    },{...},{...}
]

这有意义吗?当然,长度对于包含在对象中并不是绝对必要的。

您可以将对象的所有键提取到一个数组中,然后简单地在该数组上迭代

var obj={
“key1”:“val1”,
“key2”:“val2”
}
var keys=Object.keys(obj);//['key1','key2']
键。forEach(功能(键){
var值=obj[键]
console.log(值)
//用“价值观”做事
})
使用和对键的值求和

注意:我必须清理您的数据,并删除一个级别以简化示例。您需要根据实际数据调整它

const数据=[
{
制度:"我们",,
尺寸:{
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{//我们使用解构来创建副本
sizes={}//如果大小未定义,我们将指定一个默认值
}=数据[0];
常量sumOfSizes={};//我们将填充的未来对象
Object.keys(size).forEach((sizeIndex)=>{//我们获取对象的键,并在其上循环。
const size=size[sizeIndex];//为了清楚起见,我将所需的值赋给了一个变量。
const sumOfShapes=Object.keys(size).reduce((prevSum,shapeIndex)=>{//我们得到对象的子键并对它们的值求和。
const shapeValue=大小[形状索引];
返回prevSum+shapeValue;
}, 0);
sumOfSizes[sizeIndex]=sumOfShapes;//我们将形状的总和指定给当前鞋码。
});
console.log(sumOfSizes)
您可以使用
array#map
Object.keys()
array#reduce

7.5:{A:6,B:7,B:7,7.5:{A:6,B:7,C:7,C:7,C:7,C:7,C:7,C:14,D:14,D:11,E:7,C:7,C:14,C:14,D:14,D:14,D:14,D:11,E:2,E:2,},8:{“我们”大小,尺寸:{,尺寸:{大小:{尺寸:{7:{尺寸:{7:{7:{7:{7.5,尺寸:{7.5,尺寸:{7:{7:{7:{7:{7:{7:{7:{7:{7,7:{7.5,C:5,C:5,C:5,C:5,C:5,C:5,C:5,C:5,2E:3,'3A:1,A:53,B:159,}, ]; var结果=data.map((obj)=>{ 返回对象键(对象大小).reduce((arr,k)=>{ 设res=Object.keys(对象大小[k])。reduce((r,k1)=>{ r['size']=k; r、 push({name:k1,value:obj.size[k][k1]}); r、 总+=目标尺寸[k][k1]; 返回r; },{形状:[],总数:0}); arr.push(res); 返回arr; },[]); }) 控制台日志(结果)
.as console wrapper{max height:100%!important;top:0;}
好吧,你已经有了多少人有一个大小为x的特定形状的数据,因为这是你提供的数据。你将如何使用jQuery实现这一点?FWIW,你添加到问题中的数据有错误。一个包含嵌套对象的对象数组。。。考虑改善你的数据结构,谢谢你,哈桑,这是可行的!由于
data
是一个只有一个项的数组,因此我删除了
data.map()
,而将第一个
对象.keys(数据[0].size.)赋值。将(…)
减少到
结果
变量。现在我知道当组合成一个值时,
reduce
是一种方法。我想,
data
中可能有更多的值,这就是我使用它的原因。是的,
array#reduce
是积累结果的极好工具。快乐编码!