【问题标题】:nodejs loops and arraysnodejs循环和数组
【发布时间】:2015-06-26 01:59:36
【问题描述】:

我似乎无法掌握 nodejs 中的数组函数,并且在编程以使其按我想要的方式工作时遇到了一些问题。

我正在做的是从 api 获取 json 信息并将其用于数组。

我想要这样的格式

array = [ { Coin:{Balance: 0, Available: 0, Pending: 0, Exchange: 0} ]

API 的输出如下所示

 [ { Currency: 'BTC',
       Balance: 3.0000000000000004e-8,
       Available: 3.0000000000000004e-8,
       Pending: 0,
       CryptoAddress: '1G29t11ioGa5cmWJKLeanbNz1TA77eS1gK' },
     { Currency: 'DGB',
       Balance: 0,
       Available: 0,
       Pending: 0,
       CryptoAddress: 'DTcrZApNRDmq41bhcPcZdhhApaLQGr7nfj' }
 ] }

我用来尝试将它们添加到新数组的脚本是

var redis = require('redis');
client = redis.createClient()

var bittrex = require('node.bittrex.api');
bittrex.options({
  'apikey': 'KEY',
  'apisecret': 'SECRET',
  'stream': true,
  'verbose': true,
  'cleartext': true,
  'baseUrl': 'https://bittrex.com/api/v1.1'
});


bittrex.getbalances(function(data) {
  console.log(data);
  array = [];
  for (var coin in data.result) {
    Name = data.result[coin].Currency;
    array.push(Name);

    array[Name].Balance.push(data.result[coin].Balance);

    array[Name].Available.push(data.result[coin].Available);
    array[Name].Pending.push(data.result[coin].Pending);


    client.hget("Exchange_Rates", data.result[coin].Currency, function(err, exchange) {
      array[Name].Exchange.push(exchange);
    });

  };

  console.log(array);


  for (var sell in array) {
    bittrex.sendCustomRequest('https://bittrex.com/api/v1.1/market/selllimit?apikey=KEY&market=BTC-' + sell + '&quantity=' + array[Name].Available + '&rate=' + array[Name].Exchange, function(data) {
      console.log(data);
    }, true);
  };


});

【问题讨论】:

    标签: javascript arrays node.js loops


    【解决方案1】:

    您可以使用 .map 函数返回您需要的格式。

       return data.result.map(function (item) {
                        return {coin: {
                            balance: item.balance,
                            available: item.available,
                            pending: item.pending,
                            exchange: item.exchange,
    
                        }};
                    });
    

    【讨论】:

    • 我之前从未使用过地图功能,因此添加它有点复杂。我还是不知道该怎么处理它。需要将交易所价格推入数组。我认为其他人也应该在使用之前被带到一个新数组中。
    • Map 函数作用于对象“数据”。它遍历对象并返回新格式,如上图所示。您必须小心并使用承诺或回调。 Node 是一种异步语言,因此操作继续进行。确保你的嵌套是正确的,或者你使用类似 bluebird 的东西
    • 我最终将使用与此不同的东西。因为我需要在构建后将变量推送到数组中。 redis 是异步的,因此在使用 client.hget 时,它会添加到数组中的最后一个变量,而不是它特定的变量。下面的最后一篇文章适用于我需要的一切,但汇率除外。我不知道如何使用 client.hget 进入正确的条目
    【解决方案2】:

    其实你搞错了for(var i = 0;i<array.length;i++)for(var i in array)

    如果你使用第一个 for 循环,你可以这样使用:array[i] ... 但在第二个 for 循环中,i 包含你想要的值。

    array = [];
    

    你声明的变量没有var,这是一种不好的做法,它可能会发生意外错误。

    bittrex.getbalances(function(data) {
      console.log(data);
      array = [];
      for (var coin in data.result) {
        Name = data.result[coin].Currency;
        array.push(Name);
    
        array[Name].Balance.push(data.result[coin].Balance);
    

    数据等于对象

    [ { Currency: 'BTC',
           Balance: 3.0000000000000004e-8,
           Available: 3.0000000000000004e-8,
           Pending: 0,
           CryptoAddress: '1G29t11ioGa5cmWJKLeanbNz1TA77eS1gK'
      },
      { Currency: 'DGB',
           Balance: 0,
           Available: 0,
           Pending: 0,
           CryptoAddress: 'DTcrZApNRDmq41bhcPcZdhhApaLQGr7nfj'
      }] 
    

    所以像这样迭代:

    var data = [ { Currency: 'BTC',
           Balance: 3.0000000000000004e-8,
           Available: 3.0000000000000004e-8,
           Pending: 0,
           CryptoAddress: '1G29t11ioGa5cmWJKLeanbNz1TA77eS1gK' },
         { Currency: 'DGB',
           Balance: 0,
           Available: 0,
           Pending: 0,
           CryptoAddress: 'DTcrZApNRDmq41bhcPcZdhhApaLQGr7nfj' 
       }] ;
    
      var array = [];
      data.map(function(ele) {
         array.coin = {
            Balance : ele.Balance,
            Available : ele.Available,
            Pending : ele.Pending,
            Exchange : ele.Currency
        }
        return array;
       });
    
       console.log(array);
    

    提示:我不知道 Exchange 是什么,所以我用 Currency 代替它。

    【讨论】:

      【解决方案3】:

      我的目标似乎比我想象的要容易一些。不过,我似乎无法确定交易价格

      bittrex.getbalances(function(data) {
        array = [];
      
        for (var coin in data.result) {
          Name = data.result[coin].Currency;
          array[Name] = {
            Balance: data.result[coin].Balance,
            Available: data.result[coin].Available,
            Pending: data.result[coin].Pending,
            Exchange: []
          };
      
      
          client.hget("Exchange_Rates", data.result[coin].Currency, function(err, exchange) {
            array[Name].Exchange.push(exchange);
          });
      
        };
      
        console.log(array);
      
        for (var sell in array) {
          bittrex.sendCustomRequest('https://bittrex.com/api/v1.1/market/selllimit?apikey=539221df75b74af299958012e09c3912&market=BTC-' + sell + '&quantity=' + array[sell].Available + '&rate=' + array[sell].Exchange, function(data) {
            //console.log( data );
          }, true);
        };
      
      
      });

      【讨论】:

        【解决方案4】:

        您的代码中有几个误解。

        • array.push(Name) 在这里您将Name 附加到var array = new Array()。数组自动按从 0 开始的整数排序和索引,因此您的第一个元素现在位于 array[0] 而不是 array[Name] - 请参阅 Array()
        • var Name = data.result[coin].Currency; 是字符串,例如'BTC' 但您将属性设置为像 Name.Balance 这样只能对 JS 对象执行,例如 var object = {} 存储 key: value 对 - 请参阅 Object()
        • array[Name].Balance.push(data.result[coin].Balance); 即使array[Name] 是一个对象,您也可以设置它的属性Balance 并立即将其推送到它,就好像它是一个数组一样,但事实并非如此。属性Balance之前没有定义,所以它是undefined,你不能推送到undefined,你必须先设置属性,比如array[Name].Balance = []; array[Name].Balance.push(...)。但我假设你甚至不想将属性Balance 设置为数组,而是存储data.result[coin].Balance 的值,所以你应该这样做array[Name].Balance = data.result[coin].Balance

        TommyK 有很好的例子如何正确地做到这一点(他甚至使用更优雅的 array.map() 函数来修改数组)但恐怕你需要先学习 JS 的基础知识,然后再继续。

        【讨论】:

        • 除了汇率现在一切正常。所以我只需要学会在创建后正确地将汇率推入数组。并留下一个 0 条目。你是对的,我是 javascript 的初学者。我确实知道通常如何处理数组,但我试图通过给它们一个名称来添加一种更简单的方法来访问每个数组。我上面所做的让我走到了那一步。
        • 我不想让你厌烦技术文章。我只是看到你错过了对 JS 类型的一般理解,我敢肯定,除非你对此有所了解,否则你会遇到这个障碍。 JS 没有 associative_array 它只有 ArrayObjectTRY READ THIS ARTICLE.
        猜你喜欢
        • 2018-11-23
        • 1970-01-01
        • 2020-10-28
        • 2017-06-02
        • 2018-04-21
        • 1970-01-01
        • 2021-06-08
        • 1970-01-01
        • 2021-02-13
        相关资源
        最近更新 更多