从Json Object获取唯一值

时间:2018-06-23 11:47:13

标签: javascript axios

我正在尝试从公众那里获取所有算法来挖掘api:

var lookup = {}
var result = []

axios.get('https://whattomine.com/calculators.json')
  .then(function(response) {
    console.log(response)
    for (var item, i = 0; item = response["coins"][i++];) {
      var algorithm = item.algorithm

      if (!(algorithm in lookup)) {
        lookup[algorithm] = 1
        result.push(algorithm)
      }
    }
    console.log(result)
  })
<script src="https://cdnjs.cloudflare.com/ajax/libs/axios/0.18.0/axios.min.js"></script>

如您所见,我正在使用axios查询api。然后,我想过滤掉所有不在查找中的算法。

因此,我希望拥有: []

但是,我目前收回了['Keccak', 'Scrypt-OG', 'X11']

有人建议我在做什么错吗?

感谢您的答复!

2 个答案:

答案 0 :(得分:2)

您应该看到数据结构:coins的键是字符串,而不是像i ++这样的数字

var lookup = {}
var result = []

axios.get('https://whattomine.com/calculators.json')
  .then(function(response) {
    for (var key in response.data["coins"]) {
      var item = response.data["coins"][key]
      var algorithm = item.algorithm

      if (!(algorithm in lookup)) {
        lookup[algorithm] = 1
        result.push(algorithm)
      }
    }
    console.log(result)
  })
<script src="https://cdnjs.cloudflare.com/ajax/libs/axios/0.18.0/axios.min.js"></script>

答案 1 :(得分:2)

正如其他人所说,response是具有data属性的对象,包含实际响应。另外,您试图像遍历数组一样遍历它们,但这是一个将硬币名称作为属性的对象。 Lodash可以使您的生活更轻松:

axios.get('https://whattomine.com/calculators.json')
  .then(response => {
    const coins = response.data.coins;
    const result = _.uniq(_.map(coins, item => item.algorithm));
    console.log(result);
  });
<script src="https://cdnjs.cloudflare.com/ajax/libs/axios/0.18.0/axios.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js"></script>

  • _.map()允许您遍历数组或对象,这在这里很有用。

  • _.uniq()将从值数组中删除所有重复项。