#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;
});