如何将含嵌套对象的源对象转换为包含货币字段的对象数组
解决嵌套货币对象转带
currency字段的数组问题 嘿,我来帮你搞定这个转换问题~你之前的代码已经迈出了第一步,但确实漏掉了货币代码这个关键信息,还把timestamp这种非货币数据也混进去了,咱们调整一下就能得到预期的结果。
需求回顾
先明确一下你的核心需求:把包含多种货币数据的源对象,转换成每个元素都带currency字段的对象数组,同时保留各时间段的数值。
源数据:
var data = { "USD": { "7d": "32053.72", "30d": "33194.68", "24h": "31370.42" }, "AUD": { "7d": "43134.11", "30d": "44219.00", "24h": "42701.11" }, "RUB": { "7d": "2451451.45", "30d": "2465896.74", "24h": "2398589.80" }, "timestamp": 1626699964, "JPY": { "7d": "3537735.55", "30d": "3664620.47", "24h": "3472632.46" }, "BRL": { "7d": "167555.18", "30d": "169473.27", "24h": "163054.93" }, "ILS": { "7d": "108658.72", "30d": "111663.67", "24h": "106988.58" }, "GBP": { "7d": "23257.66", "30d": "23838.55", "24h": "22923.17" }, "PLN": { "7d": "124869.61", "30d": "127872.57", "24h": "122668.16" }, "CAD": { "7d": "40425.62", "30d": "41444.76", "24h": "39827.13" }, "EUR": { "7d": "27187.74", "30d": "27955.81", "24h": "26659.79" } }
预期格式:
[ { currency: "USD", 7d: "32053.72", 30d: "33194.68", 24h: "31370.42" }, { currency: "AUD", 7d: "43134.11", 30d: "44219.00", 24h: "42701.11" }, // ... 其他货币项 ]
(注:你示例里的数值看起来是复制失误,比如USD的7d写成了RUB的数值,这里按源数据的对应关系调整)
修改后的代码方案
你需要在map过程中把当前遍历的key(货币代码)作为currency字段,同时过滤掉timestamp这种非货币的键。完整代码如下:
var data = { /* 你的源数据 */ }; var convertedToArray = Object.keys(data) // 第一步:过滤掉非货币类型的键(比如timestamp) .filter(key => typeof data[key] === 'object' && !Array.isArray(data[key])) // 第二步:遍历每个货币键,构建目标对象 .map(key => { return { currency: key, // 展开当前货币的所有时间段数据 ...data[key] }; });
代码细节解释
- 过滤非货币键:用
filter方法筛选出值为对象(且不是数组)的键,自动排除timestamp这种数值类型的无关数据。 - 构建目标对象:在
map里,每个迭代项返回一个新对象,先设置currency: key(把当前的货币代码存进去),再用扩展运算符...把对应货币的7d、30d、24h字段都展开到新对象里,省去手动逐个赋值的麻烦。
额外调整(如果需要)
如果你确实需要把源数据里的24h改成示例里的24d,可以在构建对象时单独处理这个字段:
.map(key => { const currencyData = data[key]; return { currency: key, 7d: currencyData['7d'], 30d: currencyData['30d'], 24d: currencyData['24h'] // 重命名字段 }; });
这样就能得到完全符合你预期格式的数组啦~
内容的提问来源于stack exchange,提问作者TerryBear
相关产品推荐
相关产品推荐

