如何解决如何将给定的带有对象的对象转换为带有对象的数组
我有以下包含对象的对象:
{
"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: "2451451.45",30d: "2465896.74",24d: "42701.11"
},{
currency: "AUD",7d: "32053.72",30d: "33194.68",24d: "2398589.80"
}
]
等等等等。这是我的尝试:
var data = { "USD": { "7d": "32053.72","24h": "26659.79" } }
var convertedToArray = Object.keys(data).map(key => {
return data[key];
})
它可以工作,但由于某种原因,USD
、AUD
等货币字段被省略了。如何获得相同的输出但包含 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" } }
var convertedToArray = Object.keys(data).map(key => {
return {currency: key,...data[key]};
})
这里的问题是您可能需要对时间戳进行特殊检查。我不确定你想在那里做什么。
,osagognitive 的解决方案在我看来有一些缺点:
- 它不会过滤掉时间戳,创建一个奇怪的
{ currency: "timestamp" }
元素 - 它在构造记录时访问
data
中的全局...data[key]
对象。用Object.keys()
替换Object.entries()
可以避免这种情况。
此外,您可以很好地定义函数而不是深奥的 lambda。混淆后的 JavaScript 不会运行得更快,但你会花更多的时间调试它,更不用说其他人试图理解它了。
例如:
function ConvertToCurrencyArray (data) {
function SelectCurrency ([key,record]) { return key.length == 3 }
function FormatRecord ([key,record]) { return { currency: key,...record } }
return Object.entries(data).filter(SelectCurrency).map(FormatRecord);
}
如果出现问题,您可以轻松添加调试跟踪:
function ConvertToCurrencyArray (data) {
function SelectCurrency ([key,record]) {
if (key.length != 3) console.log ("filtering out " + key);
return key.length == 3
}
function FormatRecord ([key,record]) {
if (Object.keys(record).length != 3) // 3 fields expected
console.log ("unexpected record " + key + ": " + JSON.stringify(record));
return { currency: key,...record }
}
return Object.entries(data).filter(SelectCurrency).map(FormatRecord);
}
示例:
ConvertToCurrencyArray( { "USD": { "7d": "32053.72","30d": "23838.55" },"PLNZ": { "7d": "124869.61","24h": "26659.79" } })
输出:
filtering out timestamp
filtering out PLNZ
unexpected record GBP: {"7d":"23257.66","30d":"23838.55"}
现在如果你绝对确定
- 您的输入数据 100% 可靠,无需任何完整性检查即可阅读
- 您永远不需要重新考虑您的输出格式
- 你不会再碰这个代码
你可以改用这个:
var arrayOfCurrencies =
Object.entries(data)
.filter(([key,record]) => key.length == 3)
.map (([key,record]) => ({ currency: key,...record }))
,
你可以试试下面的方法
const json = '{"result":true,"count":42}';
const obj = JSON.parse(json);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。