javascript - 当dateformat为字符串时过滤一组json数据

标签 javascript json date datetime google-apps-script

假设您有一个像这样的 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/

相关文章:

java - 安卓登录: app crashes when entries are invalid?

r - 将日期列表从字符格式转换为日期格式

php - 如何找到两个月前或 N 个月前的最后一个星期一

javascript - 检测到依赖循环导入/无循环

javascript - 检查表格的单元格是否具有某种颜色

javascript - Electron - Javascript (ES6) - 导入远程类

java - 在数据库中存储月份格式(来自 Java)

javascript - 隐藏一个 div 并显示另一个 overtop 时使用 jQuery 进行幻灯片转换

javascript - jquery中解析JSON数据的问题

php - SQL INSERT 中的数字格式