Nodejs неправильно соединяет элементы JSON

#javascript #json #node.js #splice

#javascript #json #node.js #соединение

Вопрос:

У меня есть следующая функция nodejs, которая извлекает данные api (JSON) и пытается стереть все элементы с нулевым балансом и отправить JSON во внешний интерфейс.

 app.get('/getapibittrex', function(req, res){

  var url="https://bittrex.com/api/v1/account/getbalances?apikey=" req.query.apikey;                
                  request({
                    url: url,
                    json: true
                }, function (error, response, body) {

                    if (!error amp;amp; response.statusCode === 200) {
                            var datos= body.result;

                            for ( var i = 0 ; i < datos.length; i   ) {
                                if (datos[i].Balance==0)  {
                                    datos.splice(i,1);
                                }
                            }   

                            res.send(datos);
                    } else  { 
                    console.log("Error calling API: " error);
                    }
                });

});
  

С другой стороны, когда я вызываю эту функцию, я получаю элементы с нулевым балансом!! Что я получаю сейчас, так это:

 [
  {
    "Currency": "BTC",
    "Balance": 0.15080873,
    "Available": 0.143913061,
    "Pending": 0,
    "CryptoAddress": "1BtAz5AXbA4yvuSMneeSFnwdCGoHiSF6dA",
    "Requested": false,
    "Uuid": "4662193c-2ca1-4729-beb8-85a373a9879e"
  },
  {
    "Currency": "BOST",
    "Balance": 0,
    "Available": 0,
    "Pending": 0,
    "CryptoAddress": "BBdyTs52CmfX9MW1e8rYvoEFBvXByVYXaQ",
    "Requested": false,
    "Uuid": "4662193c-2ca1-4729-beb8-85a373a9879e"
  },
  {
    "Currency": "VOOT",
    "Balance": 0,
    "Available": 0,
    "Pending": 0,
    "CryptoAddress": "VDcdFniPZnfqT5jYVQsmqTfRXFpcGarKc5",
    "Requested": false,
    "Uuid": "4662193c-2ca1-4729-beb8-85a373a9879e"
  },
  {
    "Currency": "CLOAK",
    "Balance": 561.25771864,
    "Available": 0,
    "Pending": 0,
    "CryptoAddress": "C3SkQ7uv1kZU7ZnpdcvCT2NYpFAqrR2Qdm",
    "Requested": false,
    "Uuid": "4662193c-2ca1-4729-beb8-85a373a9879e"
  },
  {
    "Currency": "LOL",
    "Balance": 0,
    "Available": 0,
    "Pending": 0,
    "CryptoAddress": "LdTMw3czCvmmKJCSCgkC2sFsRPz91x7tPp",
    "Requested": false,
    "Uuid": "4662193c-2ca1-4729-beb8-85a373a9879e"
  },
  {
    "Currency": "HPY",
    "Balance": 0,
    "Available": 0,
    "Pending": 0,
    "CryptoAddress": "HS38GKGBKrraiNbyPHM1gmruCtA8N7B7PW",
    "Requested": false,
    "Uuid": "4662193c-2ca1-4729-beb8-85a373a9879e"
  },
  {
    "Currency": "ATH",
    "Balance": 0,
    "Available": 0,
    "Pending": 0,
    "CryptoAddress": "AY9P5Q3MhfsFG959UrEd6UV9nfVnmgjrBD",
    "Requested": false,
    "Uuid": "4662193c-2ca1-4729-beb8-85a373a9879e"
  },
  {
    "Currency": "PTC",
    "Balance": 14467.59987795,
    "Available": 0,
    "Pending": 0,
    "CryptoAddress": null,
    "Requested": false,
    "Uuid": "4662193c-2ca1-4729-beb8-85a373a9879e"
  },
  {
    "Currency": "RZR",
    "Balance": 45.18269779,
    "Available": 0,
    "Pending": 0,
    "CryptoAddress": null,
    "Requested": false,
    "Uuid": "4662193c-2ca1-4729-beb8-85a373a9879e"
  },
  {
    "Currency": "KORE",
    "Balance": 4923.65705238,
    "Available": 0,
    "Pending": 0,
    "CryptoAddress": null,
    "Requested": false,
    "Uuid": "4662193c-2ca1-4729-beb8-85a373a9879e"
  },
  {
    "Currency": "TAC",
    "Balance": 4744.48127806,
    "Available": 4744.48127806,
    "Pending": 0,
    "CryptoAddress": "TcuQAW5QqCHwtpiGDU6uaox8eG3z3zvugZ",
    "Requested": false,
    "Uuid": "4662193c-2ca1-4729-beb8-85a373a9879e"
  },
  {
    "Currency": "AERO",
    "Balance": 0,
    "Available": 0,
    "Pending": 0,
    "CryptoAddress": "APgKhLWQs1sdbgPHqs228nVdbH3B3xDBrM",
    "Requested": false,
    "Uuid": "4662193c-2ca1-4729-beb8-85a373a9879e"
  },
  {
    "Currency": "SC",
    "Balance": 1620.08759994,
    "Available": 336.88682308,
    "Pending": 0,
    "CryptoAddress": "BFUWs4gnZpB8Qb7RoiYjnst1iSqHCRC6Ec",
    "Requested": false,
    "Uuid": "4662193c-2ca1-4729-beb8-85a373a9879e"
  }
]
  

Должно быть что-то, чего мне не хватает….
С уважением,

Комментарии:

1. Плохая идея изменять коллекцию во время ее повторения. Серьезно :).

2. Конечно, @YuryTarabanko имеет в виду, что вы изменяете массив при выполнении итерации по нему, поэтому вы изменяете его длину при работе с его частями. Это всегда приводит к неожиданным результатам, так как i увеличивается один раз, но связанная ссылка уменьшается более одного раза за удаление, и длина уменьшается. Смотрите: jsfiddle.net/jaZNY Обратите внимание, что выполняется только три итерации?

Ответ №1:

Вы можете использовать Array.prototype.filter и не изобретать велосипед.

 var datos = body.result.filter(function(data){
    return !!data.Balance;
});