簡體   English   中英

如何將給定的帶有對象的對象轉換為帶有對象的數組

[英]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];
})

它有效,但由於某種原因, USDAUD等貨幣字段被省略。 如何獲得相同的輸出但包含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"}

現在如果你絕對確定

  • 您的輸入數據 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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM