javascript - 在 JavaScript 中迭代 JSON 对象
问题描述
我有一个奇怪的 JSON 对象。我不确定如何迭代它来获取值。
我可以读取一个特定的值,但不知下一步该做什么。
var sku_object = {
"SkuDevices": {
"cb_skus": [
{
"XCZU9EG-1E": [
{
"x_speed_alias": [
{
"$": 1
}
],
"x_speed": [
{
"$": 1
}
],
"device_speed": [
{
"$": "1REL"
}
],
"hardware_product": [
{
"$": "XCZU9EG"
}
],
"device_grade": [
{
"$": "E"
}
],
"status": [
{
"$": "Active"
}
]
}
],
"XCZU9EG-2I-4522": [
{
"x_speed": [
{
"$": 2
},
{
"$": 2
}
],
"x_speed_alias": [
{
"$": 2
}
],
"spec_class": [
{
"$": "SCD"
}
],
"device_speed": [
{
"$": "2REL"
}
],
"x_spec_suffix": [
{
"$": 4522
}
],
"spec_name": [
{
"$": "SCD4522"
}
],
"hardware_product": [
{
"$": "XCZU9EG"
}
],
"x_silicon_stage": [
{
"$": "PROD"
}
],
"device_grade": [
{
"$": "I"
}
],
"status": [
{
"$": "Active"
}
]
}
]
}
],
"device": [
{
"$": "ZU9EG"
}
]
}
}
alert (sku_object.SkuDevices["cb_skus"][0]["XCZU9EG-1E"][0]["device_speed"][0]["$"])
如果您看到最后一行,我可以读取特定值。
现在在 cb_skus -> XCZU9EG-1E 和 XCZU9EG-2I-4522 下是不同的,它可以是任何东西。
同样在 XCZU9EG-2I-4522 下,属性的数量不同。
目前我只能想到:
for (var i = 0, len = sku_object.XxpubSkuDeviceCollection.cb_skus.length; i < len; ++i) {
var ss= sku_object.XxpubSkuDeviceCollection.cb_skus[i];
alert (ss["XCZU9EG-1E"][0]["device_speed"][0]["$"])
}
这并没有真正迭代。还有如何获得像“device_speed”这样的键?
我应该补充一下,我试图迭代它的原因是用奇怪的 $ 符号构建一个 JSON 对象。像这样的东西:
{
"device" : "zu9eg",
"cb_skus" : {
"XCZU9EG-1E" : {"hardware_product" : "XCZU9EG",
"device_speed" : "1REL",
"x_speed" : "1",
"device_grade" : "E",
"status" : "active"
},
"XCZU9EG-2I-4522" : {"hardware_product" : "XCZU9EG",
"device_speed" : "2REL",
"x_speed" : "2",
"x_speed_alias" : "2",
"device_grade" : "I",
}
}
}
解决方案
由于给定数据的奇怪数组/对象嵌套性质,您需要映射数组并将属性从不规则的深游泳最终键的海洋中捞出。
然后形成具有嵌套属性的新对象,以获得简单的、只有两级深度的属性。
function final(a) {
return '$' in a[0]
? a[0].$
: Object.assign(
...a.map(o =>
Object.assign(...Object.entries(o).map(([k, v]) => ({ [k]: final(v) })))
)
);
}
var sku_object = { SkuDevices: { cb_skus: [{ "XCZU9EG-1E": [{ x_speed_alias: [{ $: 1 }], x_speed: [{ $: 1 }], device_speed: [{ $: "1REL" }], hardware_product: [{ $: "XCZU9EG" }], device_grade: [{ $: "E" }], status: [{ $: "Active" }] }], "XCZU9EG-2I-4522": [{ x_speed: [{ $: 2 }, { $: 2 }], x_speed_alias: [{ $: 2 }], spec_class: [{ $: "SCD" }], device_speed: [{ $: "2REL" }], x_spec_suffix: [{ $: 4522 }], spec_name: [{ $: "SCD4522" }], hardware_product: [{ $: "XCZU9EG" }], x_silicon_stage: [{ $: "PROD" }], device_grade: [{ $: "I" }], status: [{ $: "Active" }] }] }], device: [{ $: "ZU9EG" }] } },
result = final([sku_object.SkuDevices]);
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
推荐阅读
- javascript - cmd node.js时间和windows系统时间不一样
- python - 如何在 python 中捕获错误的 zip 文件错误?
- javascript - 此 javascript 显示由 Shamweel 设计,但所有文本都开始包含链接如何修复仅 Shamweel 包含链接的问题
- spring - 可模拟的弹簧依赖注入映射器定义
- scala - 评估条件并将其结果绑定到模式匹配中?
- python - CPython - 访问循环深度级别 - 块堆栈
- asp.net - 如何找到 MvcSiteMapProvider.pdb 版本 2.0.0
- json - 解析 JSON(地图列表)返回 null
- java - 如何使用 DateTimeFormatter 显示小时和分钟的时区?
- google-app-engine - 将 GCP App Engine 映射到子域(不是裸域)