javascript - 从数组中检索对象 WHERE 另一个对象匹配另一个数组
问题描述
请注意:这不是重复的:涉及不同的需求。
我正在为 cripto 资产开发基于 Google 表格的投资组合。摘要页面提供任何交易所中所有资产的余额。
第一个函数连接到第一个交易所的账户(比如 Bitstamp)并下载你钱包中所有资产名称的最新列表,并将它们写在第一列中,沿着交易所列下的相应余额.
然后第二个函数从第二个交易所的账户(比如说币安)中检索资产的金额,并将它们写入相应的列,但是这次当然脚本需要将金额与已经从第一个脚本。
这里没有固定单元!!!
换句话说,第二个脚本需要了解在 WAT ROW 中设置了哪些内容,例如第一列中的 BTC,并且需要在相应行的 binance 列中写入相应的 btc 数量。
如果我们在 sql 上,你可以写类似
set btc_amount FROM binance in BINANCE column WHERE btc_asset === cell(i+2, 1).getValue()
不幸的是,这太容易了,所以我想我们做不到..
现在,你有什么建议?数组比较?数组数组数组?数组映射?数组过滤器?过滤器。这个?
到目前为止,这是我尝试过的:没有什么是 100% 有效的。有些东西根本行不通。
...
var data = UrlFetchApp.fetch(url, params);
var data = JSON.parse(data.getContentText());
var data = data.balances;
//binance api returns also assets with zero balance, so we need to filter
var data = data.filter(function (el) {
return el.free > 0;
});
var i;
for (i=0; i < data.length; i++) {
var asset = data[i].asset;
//this bizarre back and forth is needed in order to BOTH get rid of trailing zeros AND render the value a number format
var free = data[i].free; var a = parseFloat(free); var a = a.toString(); var free = parseFloat(a);
//my first choice was to convert the list from the 1st column into an array and try to perform some sort of comparison or mapping
var cont = sheet.getRange(2, 1, 16).getValues();
//var cont = cont.toLowerCase()
//then flattening the array from 2d to 1d
function flatten(tdArray){
return [].concat.apply([], tdArray);
}
var cont = flatten(cont);
var corr = sheet.getRange(i + 2, 1).getValue();
var check = data.map(function (value){
return value.asset == cont;
});
if (check == true) {sheet.getRange(i + 2, 8).setValue(free)}
//var check = check[i];
// if (check == true){sheet.getRange(i + 2, 8).setValue(free);}
//sheet.getRange(i + 2, 1).setValue(asset);
//sheet.getRange(i + 2, 8).setValue(free);
}//fine del for
Logger.log(corr);
}
var data = UrlFetchApp.fetch(url, params);
var data = JSON.parse(data.getContentText());
var data = data.balances;
var data = data.filter(function (el) {
return el.free > 0;
});
var i;
for (i=0; i < data.length; i++) {
var asset = data[i].asset;
var free = data[i].free; var a = parseFloat(free); var a = a.toString(); var free = parseFloat(a);
var cont = sheet.getRange(2, 1, 16).getValues();
//var cont = cont.toLowerCase()
function flatten(tdArray){
return [].concat.apply([], tdArray);
}
var cont = flatten(cont);
var h;
for (h=0; h<cont.length; h++){if (cont[h] === asset){sheet.getRange(i + 2, 8).setValue(free)}}
// Logger.log(corr);
}}
到目前为止,这是我一直在尝试的两个解决方案。谢谢
编辑:具有不同 Json 结构的新类似案例
我已将 ziganotschka 建议的相同模式应用于 Bitstamp 案例。
现在,如您所见,Bitstamp 返回的 Json 响应与来自 binance 的响应不同,这使我更难检索对象和属性,因为它的行为与 binance 的行为不同,即:作为一个典型的数组:
Bitstamp Json 数据
{btc_available=0.00000684, eth_reserved=0.00000000, eur_balance=0000.63, btcusd_fee=0.500, xrpeur_fee=0.500, btc_balance=0.00000684, xrp_withdrawal_fee=0.02000000, ethusd_fee=0.500, ltceur_fee=0.500, eth_balance=0.11033051, xrp_reserved=0.00000000, bchusd_fee=0.500, eur_reserved=0.00, bch_available=0.00000000, usd_available=0.18, xrp_available=0.75000000, xrpusd_fee=0.500, ltcbtc_fee=0.500, bcheur_fee=0.500, ltc_available=0.00000000, btc_reserved=0.00000000, ltc_withdrawal_fee=0.00100000, usd_reserved=0.00, btc_withdrawal_fee=0.00050000, eurusd_fee=0.500, xrp_balance=0.75000000, ltcusd_fee=0.500, ltc_balance=0.00000000, bch_reserved=0.00000000, bch_withdrawal_fee=0.00010000, eur_available=0000.63, ltc_reserved=0.00000000, bchbtc_fee=0.500, ethbtc_fee=0.500, etheur_fee=0.500, usd_balance=0.18, eth_available=0.11033051, btceur_fee=0.500, eth_withdrawal_fee=0.00100000, bch_balance=0.00000000, xrpbtc_fee=0.500}
币安 Json 数据
{balances=[{asset=BTC, free=0.00966600, locked=0.00000000}, {asset=LTC, free=0.00000000, locked=0.00000000}, {asset=ETH, free=0.00001251, locked=0.00000000}, {asset=NEO, free=0.00000000, locked=0.00000000}, {asset=BNB, free=0.07496873, locked=0.00000000}, {asset=QTUM, free=0.00000000, locked=0.00000000}, {asset=EOS, free=0.00000000, locked=0.00000000}, {asset=SNT, free=0.00000000, locked=0.00000000}, {asset=BNT, free=0.00000000, locked=0.00000000}, {asset=GAS, free=0.00000000, locked=0.00000000}, ...
所以我最终构建了两个新数组,然后加入它们,在一开始就过滤数组:
var data = JSON.parse(data.getContentText());
var keys = Object.keys(data);
var values = Object.keys(data).map(function(e){return data[e]});
var result = [];
var k;
for (k=0; k<keys.length; k++){
if (keys[k].slice(4, 13) == "available") {result.push([keys[k], values[k]]);}}
var i;
for (i=0; i<result.length; i++) {
var key = result[i][0].slice(0,3);
var key = key.toUpperCase();
var row = rows.indexOf(key)+2;
var value = result[i][1];
if (row>=2){
sheet.getRange(row, 5).setValue(value);
}
}
它确实有效,但我确信有一种更优雅或更直接的方式来做到这一点。我首先考虑将 Json 转换为一个数组,以使其看起来(和工作)像 binance 代码中的那个,但我做不到。有什么建议吗?
解决方案
您可以使用indexOf()
此方法允许您查找字符串在数组中的位置。
基于您的数据的示例代码段:
function myFunction() {
...
var oldAsset=sheet.getRange(2, 1, 16).getValues(); //Is the range fix or dynamic?
var rows=[];
for (j=0; j < oldAsset.length; j++) {
rows.push(oldAsset[j][0]);
}
var data=...//here comes your data processing part
for (i=0; i < data.length; i++) {
var newAsset=data[i].asset;
var free = data[i].free; // process as necessary
var row=rows.indexOf(newAsset)+2; //THIS THE CRUCIAL PART TO FIND THE CORRECT ROW
if (row>0){
sheet.getRange(row, 8).setValue(free);
}
}
}
由于我不知道您的数据是什么样的,因此我没有在此代码片段中实现诸如等
toLowerCase()
处理步骤 。parseFloat()
推荐阅读
- python - 有没有办法在散景中使用基于文本的 X 值?
- javascript - Dynamics365:如何将二进制图像转换为实际图像
- c# - 您如何访问 T4 文本模板中的发布信息?
- php - 我不明白“php pdo 错误处理程序”的错误
- xml - Bash 脚本使用 XMLStarlet 将 xml 元素解析为 key=value 对
- python - Python新手,请问我的说法有什么问题?
- python - 动态大小多维数组
- c# - 如何在 Visual Studio Code 中为 Unity 函数名称获取智能感知?
- java - 使用 mysql 在 Spring Boot 应用程序中避免“设置会话事务读取”
- python - 找到数组低于某个阈值的第一个索引(并保持低于一段时间)