假设您有一个像这样的 json 响应字符串,并且您想按日期进行过滤。 您只想显示特定日期之后的记录。
[{btc=0, datetime=2018-01-30 12:16:11, eur=410.00, fee=0.00, usd=0, id=***, btc_usd=0.00, type=0}, {btc=0, eth_eur=692.81, datetime=2018-02-06 16:45:16, eur=-5.20, fee=0.02, usd=0, eth=0.00750000, id=***, type=2, order_id=***}, {btc=0, eth_eur=699, datetime=2018-02-05 17:04:25, eur=5.24, fee=0.02000000, usd=0, eth=-0.00750000, id=***, type=2, order_id=***}, {btc=0, eth_eur=562.1, datetime=2018-02-04 17:52:09, eur=-5.62, fee=0.02, usd=0, eth=0.01000000, id=***, type=2, order_id=***}, {btc=0, eth_eur=567.2, datetime=2018-02-06 20:24:07, eur=5.67, fee=0.02000000, usd=0, eth=-0.01000000, id=***, type=2, order_id=***}, {btc=0, datetime=2018-04-28 17:22:21, eur=0, fee=0.00000000, usd=0, eth=0.38811442, id=***, btc_usd=0.00, type=0}, {btc=0, eth_eur=563, datetime=2018-04-28 17:42:51, eur=218.50, fee=0.55000000, usd=0, eth=-0.38810000, id=***, type=2, order_id=***}, {btc=0, eth_eur=563, datetime=2018-04-28 17:47:52, eur=0.01, fee=0.01000000, usd=0, eth=-0.00001442, id=***, type=2, order_id=***}, {btc=0.01786568, btc_eur=5583.33, datetime=2018-08-14 12:01:13, eur=-99.75, fee=0.25, usd=0, id=***, type=2, order_id=***}]
类似的情况
{btc_available=0.01489932, eth_reserved=0.00000000, eur_balance=1858.63, btcusd_fee=0.500, xrpeur_fee=0.500, btc_balance=0.01489932, xrp_withdrawal_fee=0.02000000, ethusd_fee=0.500, ltceur_fee=0.500, eth_balance=1.30423351, xrp_reserved=0.00000000, bchusd_fee=0.500, eur_reserved=0.00, bch_available=0.00000000, usd_available=0.18, xrp_available=328.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=328.75000000, ltcusd_fee=0.500, ltc_balance=0.00000000, bch_reserved=0.00000000, bch_withdrawal_fee=0.00010000, eur_available=1858.63, ltc_reserved=0.00000000, bchbtc_fee=0.500, ethbtc_fee=0.500, etheur_fee=0.500, usd_balance=0.18, eth_available=1.30423351, btceur_fee=0.500, eth_withdrawal_fee=0.00100000, bch_balance=0.00000000, xrpbtc_fee=0.500}
我可以应用这个过滤器:
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]]);}}
在这种情况下我无法应用。
所以我想我应该应用 for(){}
案例,但是有没有更合理、更有效的方法来做到这一点?
var i;
for (i=0; i < data.length; i++) {
var d = data[i].datetime;
var bits = d.split(/\D/);
var date = new Date(bits[0], --bits[1], bits[2], bits[3], bits[4], bits[5]);
var date = (date.getTime().toFixed(0))/1000;
var date = date.toString();
if (date > lastDate) { //IFFONE
}
}
我什至考虑尝试从 json 字符串中提取每对键/值集并将它们呈现为数组,这样我就可以始终指向确切的位置(在本例中为日期时间),但我想有一个更直接的方法和一致的方式。你会怎么做?谢谢
ps:我忘了提到我们在 google apps 脚本
编辑:应用@contributorpw过滤器时的结果:
这个脚本
var data = {key: cred.key, signature: signature, nonce: nonce, sort: 'asc', limit: '10'};
var options = {'method' : 'post', 'muteHttpExceptions' : true, 'payload' : data};
var data = UrlFetchApp.fetch('https://www.bitstamp.net/api/v2/user_transactions/', options);
var data = JSON.parse(data.getContentText());
var values = data;
生成以下一组 json 数据:
[{btc=0, datetime=2018-01-31 12:15:11, eur=410.00, fee=0.00, usd=0, id=50575781, btc_usd=0.00, type=0},
{btc=0, eth_eur=692.81, datetime=2018-02-04 16:49:16, eur=-5.20, fee=0.02, usd=0, eth=0.00750000, id=52010995, type=2, order_id=893820507},
{btc=0, eth_eur=699, datetime=2018-02-04 17:04:25, eur=5.24, fee=0.02000000, usd=0, eth=-0.00750000, id=52013332, type=2, order_id=893880089},
{btc=0, eth_eur=562.1, datetime=2018-02-05 17:52:09, eur=-5.62, fee=0.02, usd=0, eth=0.01000000, id=52338326, type=2, order_id=900603492},
{btc=0, eth_eur=567.2, datetime=2018-02-05 20:29:07, eur=5.67, fee=0.02000000, usd=0, eth=-0.01000000, id=52444353, type=2, order_id=900621129},
{btc=0, datetime=2018-04-30 17:29:21, eur=0, fee=0.00000000, usd=0, eth=0.38811442, id=64286847, btc_usd=0.00, type=0},
{btc=0, eth_eur=563, datetime=2018-04-30 17:41:51, eur=218.50, fee=0.55000000, usd=0, eth=-0.38810000, id=64287296, type=2, order_id=1424216470},
{btc=0, eth_eur=563, datetime=2018-04-30 17:41:52, eur=0.01, fee=0.01000000, usd=0, eth=-0.00001442, id=64287298, type=2, order_id=1424216470},
{btc=0, datetime=2018-05-24 13:45:15, eur=1300.00, fee=0.00, usd=0, id=66875907, btc_usd=0.00, type=0},
{btc=0.01786568, btc_eur=5583.33, datetime=2018-08-12 12:01:13, eur=-99.75, fee=0.25, usd=0, id=72064184, type=2, order_id=1986400456}]
为了简单起见,它仅限于 10 条记录。
现在,假设我们要应用一个过滤器,仅返回日期 2018, 4, 16
之后的数据。
发生的情况如下:
[19-12-17 12:08:48:897 PST] [
{
"fee": "0.00",
"btc_usd": "0.00",
"datetime": "2018-05-24 13:45:15",
"usd": 0,
"btc": 0,
"type": "0",
"id": 66875907,
"eur": "1300.00"
},
{
"fee": "0.25",
"order_id": 1986400456,
"datetime": "2018-08-12 12:01:13",
"usd": 0,
"btc": "0.01786568",
"btc_eur": 5583.33,
"type": "2",
"id": 72064184,
"eur": "-99.75"
}
]
相反,你应该有更多记录..我做错了什么?
这是完整的脚本:
/* nuova funzione nonce */
_generateNonce = function() {
var now = new Date().getTime();
if(now !== this.last)
this.nonceIncr = -1;
this.last = now;
this.nonceIncr++;
// add padding to nonce incr
var padding =
this.nonceIncr < 10 ? '000' :
this.nonceIncr < 100 ? '00' :
this.nonceIncr < 1000 ? '0' : '';
return now + padding + this.nonceIncr;
} //fine funzione nonce
var nonce = this._generateNonce();
var cred = {
id:'***',
key:'***',
secret:'***'};
var message = nonce + cred.id + cred.key;
var res = Utilities.computeHmacSha256Signature(message, cred.secret).map(function(e) {return ("0" + (e < 0 ? e + 256 : e).toString(16)).slice(-2)}).join("");
var signature = res.toUpperCase();
var data = {key: cred.key, signature: signature, nonce: nonce, sort: 'asc', limit: '10'};
var options = {'method' : 'post', 'muteHttpExceptions' : true, 'payload' : data};
var data = UrlFetchApp.fetch('https://www.bitstamp.net/api/v2/user_transactions/', options);
var data = JSON.parse(data.getContentText());
var values = data;
var date = new Date(2018, 4, 16).toISOString().split(/t/i)[0];
var filteredData = values.filter(function(item) {
var d = item.datetime.split(/\s/)[0];
return d >= date;});
Logger.log(JSON.stringify(filteredData, null, ' '));
第二次编辑:问题是什么
问题很简单,我手动输入的日期和脚本生成的实际日期之间有一个月的偏移差异:所以这弄乱了所有结果,我无法理解为什么。
也就是说,当手动输入时,这行命令
var date = new Date(2018, 3, 28).toISOString().split(/t/i)[0];
Logger.log(date);
产生这样的结果:
[19-12-18 13:54:17:932 CET] 2018-04-27
另一方面,如果您直接从单元格(已经是日期格式的)提供数据,则不会发生任何奇怪的情况:
var date = aDate.toISOString().split(/t/i)[0];
var filteredData = values.filter(function(item) {
var d = item.datetime.split(/\s/)[0];
return d >= date;
});
请read this供引用。
我必须感谢@contributorpw 和@Diego 的贡献。最后我选择了contributorpw 的答案,因为我发现它的代码更加纤细和敏捷,但两者都很好且功能齐全。谢谢
最佳答案
我想使用字符串
var values = [{
btc: 0,
datetime: '2018-01-30 12:16:11',
eur: 410.0,
fee: 0.0,
usd: 0,
id: '***',
btc_usd: 0.0,
type: 0
},
...
];
var date = new Date(2018, 3, 28).toISOString().split(/t/i)[0];
var filteredData = values.filter(function(item) {
var d = item.datetime.split(/\s/)[0];
return d >= date;
});
Logger.log(JSON.stringify(filteredData, null, ' '));
效果很好。
如果您想比较日期时间,请获取date
as
var date = new Date(2018, 3, 28, 17 + 5, 42)
.toISOString()
.split(/[t\.]/i)
.slice(0, 2)
.join(' ');
并将其与
进行比较 var d = item.datetime.split(/\s/)[0];
return d >= date;
您已经考虑了时移17 + 5
。
任何时候您都可以使用跳过日期
var filteredData = values.filter(function(item) {
return item.datetime >= '2018-04-28';
});
关于javascript - 当dateformat为字符串时过滤一组json数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59374105/