微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何将给定的带有对象的对象转换为带有对象的数组

如何解决如何将给定的带有对象的对象转换为带有对象的数组

我有以下包含对象的对象:

{
  "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];
})

它可以工作,但由于某种原因,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 中的全局 ...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 举报,一经查实,本站将立刻删除。