[英]How to convert the given object with objects to an array with objects
我有以下包含對象的對象:
{
"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", "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 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[key]
的全局data
對象。 用Object.entries()
替換Object.keys()
可以避免這種情況。此外,您可以很好地定義函數而不是深奧的 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": "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" }, "PLNZ": { "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" } })
輸出:
filtering out timestamp
filtering out PLNZ
unexpected record GBP: {"7d":"23257.66","30d":"23838.55"}
現在如果你絕對確定
你可以改用這個:
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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.