首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用现有的JSON对象构建新的JS对象的最佳方法是什么?

用现有的JSON对象构建新的JS对象的最佳方法是什么?
EN

Stack Overflow用户
提问于 2017-10-19 18:56:24
回答 2查看 96关注 0票数 0

我点击了一个API,它返回一个json对象,该对象包含各种贵金属的价格信息,例如出价、要价、百分比变化、高/低等。

我不需要对象内的所有属性或所有金属类型,而且可能会有一些场景,我希望遍历对象,因此我认为只使用所需的属性重新构建对象可能是有意义的。我很好奇做这件事最好的方法是什么。

下面是API返回给我的对象:

代码语言:javascript
复制
{
"gold_bid_usd_toz": "1286.32",
"gold_ask_usd_toz": "1287.32",
"gold_change_dollar_usd_toz": "5.72",
"gold_change_percent_usd_toz": "0.44%",
"gold_high_usd_toz": "1290.07",
"gold_low_usd_toz": "1277.01",
"gold_londonfix_am": "1278.44",
"gold_londonfix_pm": "1274.48",
"silver_bid_usd_toz": "17.2",
"silver_ask_usd_toz": "17.3",
"silver_change_dollar_usd_toz": "0.2",
"silver_change_percent_usd_toz": "1.17%",
"silver_high_usd_toz": "17.25",
"silver_low_usd_toz": "16.92",
"silver_londonfix": "16.69",
"platinum_bid_usd_toz": "924.75",
"platinum_ask_usd_toz": "929.75",
"platinum_change_dollar_usd_toz": "0.78",
"platinum_change_percent_usd_toz": "0.08%",
"platinum_high_usd_toz": "930.74",
"platinum_low_usd_toz": "920.5",
"platinum_londonfix_am": "914.03",
"platinum_londonfix_pm": "912.09",
"palladium_bid_usd_toz": "958.94",
"palladium_ask_usd_toz": "963.94",
"palladium_change_dollar_usd_toz": "-2.49",
"palladium_change_percent_usd_toz": "-0.26%",
"palladium_high_usd_toz": "967.31",
"palladium_low_usd_toz": "951.88",
"palladium_londonfix_am": "919.07",
"palladium_londonfix_pm": "919.01",
"englehard_fabricated_gold": "1199.21",
"englehard_fabricated_silver": "17.7000",
"usdcad": "1.248698",
"usdcny": "6.612501",
"xpt_xpd_timestamp": "1507075200000"
}

假设我只想要金、银、铂和钯的ask_usd_tozchange_dollar_usd_tozchange_percent_usd_toz

下面是一种只使用我需要的数据构建新对象的好方法吗?

代码语言:javascript
复制
destructureObject(metal) {
    const goldPrice = metal.gold_ask_usd_toz;
    const goldChangeLastClose = metal.gold_change_dollar_usd_toz;
    const goldPercentChange = metal.gold_change_percent_usd_toz;

    const silverPrice = metal.silver_ask_usd_toz;
    const silverChangeLastClose = metal.silver_change_dollar_usd_toz;
    const silverPercentChange = metal.silver_change_percent_usd_toz;

    const platinumPrice = metal.platinum_ask_usd_toz;
    const platinumChangeLastClose = metal.platinum_change_dollar_usd_toz;
    const platinumPercentChange = metal.platinum_change_percent_usd_toz;

    const palladiumPrice = metal.palladium_ask_usd_toz;
    const palladiumChangeLastClose = metal.palladium_change_dollar_usd_toz;
    const palladiumPercentChange = metal.palladium_change_percent_usd_toz;

    const metal = {
      gold: {
        goldPrice: goldPrice,
        goldChangeLastClose: goldChangeLastClose,
        goldPercentChange: goldPercentChange
      },
      silver: {
        silverPrice: silverPrice,
        silverChangeLastClose: silverChangeLastClose,
        silverPercentChange: silverPercentChange
      },
      platinum: {
        platinumPrice: platinumPrice,
        platinumChangeLastClose: platinumChangeLastClose,
        platinumPercentChange: platinumPercentChange
      },
      palladium: {
        palladiumPrice: palladiumPrice,
        palladiumChangeLastClose: palladiumChangeLastClose,
        palladiumPercentChange: palladiumPercentChange
      }
    }
  }

我觉得有更简洁的方法可以做到这一点。但也许不是。谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-10-19 19:02:44

编辑:

代码语言:javascript
复制
function getMyObj(obj) {

    var types = ['gold', 'silver', 'platinum', 'palladium'];
    var namesMap = {
        ask_usd_toz: 'price',
        change_dollar_usd_toz: 'changeLastClose',
        change_percent_usd_toz: 'percentChange'
    };

    var myObj = {};

    types.forEach(function(type) {
        for (var prop in namesMap) {
            var key = type + '_' + prop;
            if (obj.hasOwnProperty(key)) {
                myObj[type] = myObj[type] || {};
                myObj[type][namesMap[prop]] = obj[key];
            }
        }
    });

    return myObj;
}

getMyObj(response);

其中response是json对象。

票数 4
EN

Stack Overflow用户

发布于 2017-10-19 19:14:36

您可以使用一个具有名称的对象,通过属性的第一部分映射一个组。

代码语言:javascript
复制
var data = { gold_bid_usd_toz: "1286.32", gold_ask_usd_toz: "1287.32", gold_change_dollar_usd_toz: "5.72", gold_change_percent_usd_toz: "0.44%", gold_high_usd_toz: "1290.07", gold_low_usd_toz: "1277.01", gold_londonfix_am: "1278.44", gold_londonfix_pm: "1274.48", silver_bid_usd_toz: "17.2", silver_ask_usd_toz: "17.3", silver_change_dollar_usd_toz: "0.2", silver_change_percent_usd_toz: "1.17%", silver_high_usd_toz: "17.25", silver_low_usd_toz: "16.92", silver_londonfix: "16.69", platinum_bid_usd_toz: "924.75", platinum_ask_usd_toz: "929.75", platinum_change_dollar_usd_toz: "0.78", platinum_change_percent_usd_toz: "0.08%", platinum_high_usd_toz: "930.74", platinum_low_usd_toz: "920.5", platinum_londonfix_am: "914.03", platinum_londonfix_pm: "912.09", palladium_bid_usd_toz: "958.94", palladium_ask_usd_toz: "963.94", palladium_change_dollar_usd_toz: "-2.49", palladium_change_percent_usd_toz: "-0.26%", palladium_high_usd_toz: "967.31", palladium_low_usd_toz: "951.88", palladium_londonfix_am: "919.07", palladium_londonfix_pm: "919.01", englehard_fabricated_gold: "1199.21", englehard_fabricated_silver: "17.7000", usdcad: "1.248698", usdcny: "6.612501", xpt_xpd_timestamp: "1507075200000" },
    wanted = { gold_ask_usd_toz: 'goldPrice', gold_change_dollar_usd_toz: 'goldChangeLastClose', gold_change_percent_usd_toz: 'goldPercentChange', silver_ask_usd_toz: 'silverPrice', silver_change_dollar_usd_toz: 'silverChangeLastClose', silver_change_percent_usd_toz: 'silverPercentChange', platinum_ask_usd_toz: 'platinumPrice', platinum_change_dollar_usd_toz: 'platinumChangeLastClose', platinum_change_percent_usd_toz: 'platinumPercentChange', palladium_ask_usd_toz: 'palladiumPrice', palladium_change_dollar_usd_toz: 'palladiumChangeLastClose', palladium_change_percent_usd_toz: 'palladiumPercentChange' },
    metal = {};

Object.keys(wanted).forEach(function (k) {
    var key = k.match(/^[^_]+/)[0];
    metal[key] = metal[key] || {};
    metal[key][wanted[k]] =data[k];
});

console.log(metal);
代码语言:javascript
复制
.as-console-wrapper { max-height: 100% !important; top: 0; }

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46836957

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档