【问题标题】:Fetch nested object property using lodash使用 lodash 获取嵌套对象属性
【发布时间】:2018-07-31 19:27:56
【问题描述】:

我有一个带有国家代码的嵌套对象。我需要根据条件使用lodash获取对应的货币属性。

我是 lodash 的新手,不确定我可以在这里使用哪种方法。

例如, 当我为 countryCode 'AU' 搜索相应的货币时,它应该返回 'AUD'。

目前,我得到了整个对象。

我该如何完成这项工作?

var myJSON = {
  "countryCode": {
  "Australia": "AU",
  "United States": "US",
  "Britain": "GB",
  "Japan": "JP",
  "India": "IND",
  "France": "FR",
  "Russia": "RS"
},
"countries": {
  "AE": {
    "currencies": {
    "AED": {
      "isDefault": true
    }
    }
  },
  "AL": {
    "currencies": {
    "ALL": {
      "isDefault": true
    }
    }
  },
  "AU": {
    "currencies": {
    "AUD": {
      "isDefault": true
    }
    }
  },
  "US": {
    "currencies": {
    "USD": {
      "isDefault": true
    }
    }
  },
  "GB": {
    "currencies": {
    "EUR": {
      "isDefault": true
    }
    }
  },
  "FR": {
    "currencies": {
    "EUR": {
      "isDefault": true
    }
    }
  },
  "JP": {
    "currencies": {
    "JPY": {
      "isDefault": true
    }
    }
  },
  "RS": {
    "currencies": {
    "RSD": {
      "isDefault": false
    }
    }
  },
  "ZA": {
    "currencies": {
    "ZAR": {
      "isDefault": true
    }
    }
  }
  }
};

function getData() {
 var countryCode = ['AU', 'ZA', 'JP'];
 console.log(_.pick(myJSON.countries, countryCode));
 console.log(_.values(_.pick(myJSON.countries, countryCode)));	
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.5/lodash.core.js"></script>
<button onclick="getData()">Get Data</button>

电流输出: {AU:{…},ZA:{…},JP:{…}}

期望的输出:

['AUD', 'ZAR', 'JP']

代码如下:

【问题讨论】:

    标签: javascript object ecmascript-6 nested lodash


    【解决方案1】:

    lodash 的做法是这样的:

    function getData() {
     var countryCode = ['AU', 'ZA', 'JP'];
     console.log(
       _(myJSON.countries)
        .pick(countryCode)
        .values()
        .map(function(value) { return _.keys(value.currencies)[0]; })
        .value()
     );	
    }

    【讨论】:

    • 谢谢,但那是给我国家代码。我需要货币。
    • 啊,真的。马上就换了
    • 我误解了,因为“期望的输出:['AUD', 'ZAR', 'JP']”
    • 是的,这就是它应该按照所需的输出显示的方式。但是,我从您的解决方案中得到的结果与 CountryCode 完全相同。
    【解决方案2】:

    当我搜索 countryCode 'AU' 对应的货币时, 它应该返回“AUD”。

    也试试这个 vanila js 解决方案,使用map

    var countryCode = ['AU', 'ZA', 'JP'];
    var output = countryCode.map( s => Object.keys( myJSON.countries[ s ].currencies[ 0 ] ) );
    

    【讨论】:

    • 很遗憾,此代码无法在旧浏览器中运行。
    • @Alex 由于箭头函数?
    • 是的,Object.keys 和 array.map 在较旧的 IE 中也不起作用:(
    • 我们谈论的是几岁? mapObject.keys 已经很老了!
    • 就像在 IE8 中一样:D。实际上我喜欢你的回答,它应该适用于 95% 的情况,我给出了另一个答案,只是因为已经提到了 lodash(而且它看起来更漂亮 MHO)。
    【解决方案3】:

    Pick 会按照它的要求去做。

    改为这样做:

    countryCode.map((ct) => Object.keys(myJSON.countries[ct].currencies)[0]);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-14
      相关资源
      最近更新 更多