javascript - 如何比较数组中的连续日期/时间项并根据特定时间进行过滤

标签 javascript arrays node.js

我有以下对象数组:

var transactions = [
[
    {"id":1,"sourceAccount":"A","targetAccount":"B","amount":100,"category":"food","time":"2018-03-02T10:33:00.000Z"},
    {"id":2,"sourceAccount":"A","targetAccount":"B","amount":100,"category":"food","time":"2018-03-02T10:33:50.000Z"},
    {"id":3,"sourceAccount":"A","targetAccount":"B","amount":100,"category":"food","time":"2018-03-02T10:34:30.000Z"},
    {"id":4,"sourceAccount":"A","targetAccount":"B","amount":100,"category":"food","time":"2018-03-02T10:36:00.000Z"}
],
[
    {"id":5,"sourceAccount":"A","targetAccount":"C","amount":250,"category":"other","time":"2018-03-02T10:33:00.000Z"},
    {"id":6,"sourceAccount":"A","targetAccount":"C","amount":250,"category":"other","time":"2018-03-02T10:33:05.000Z"}
]
]

我需要连续比较每个对象的time属性,并只保留那些连续事务之间的时间差小于1分钟的属性。

数组格式应该保持相同,这是我尝试过的,但运气不好,不起作用。有什么问题?

 var newArray = transactions.map(g => g.reduce((r, o, i, a) => {
        if (!i || new Date(o.time).getTime() - new Date(a[i - 1].time).getTime() >= 60000) {
            r.push([o]);
        } else {
            r[r.length - 1].push(o);
        }
        return r;
    }, []));

预期的输出是这样的:

var output = [
[
    {"id":1,"sourceAccount":"A","targetAccount":"B","amount":100,"category":"food","time":"2018-03-02T10:33:00.000Z"},
    {"id":2,"sourceAccount":"A","targetAccount":"B","amount":100,"category":"food","time":"2018-03-02T10:33:50.000Z"},
    {"id":3,"sourceAccount":"A","targetAccount":"B","amount":100,"category":"food","time":"2018-03-02T10:34:30.000Z"}
],
[
    {"id":5,"sourceAccount":"A","targetAccount":"C","amount":250,"category":"other","time":"2018-03-02T10:33:00.000Z"},
    {"id":6,"sourceAccount":"A","targetAccount":"C","amount":250,"category":"other","time":"2018-03-02T10:33:05.000Z"}
]
]

最佳答案

您可以Array#map源数组,并在每次迭代中,Array#filter通过比较当前元素的时间与前一个元素的时间来Array#filter所需的元素。

var transactions = [[{"id":1,"sourceAccount":"A","targetAccount":"B","amount":100,"category":"food","time":"2018-03-02T10:33:00.000Z"},{"id":2,"sourceAccount":"A","targetAccount":"B","amount":100,"category":"food","time":"2018-03-02T10:33:50.000Z"},{"id":3,"sourceAccount":"A","targetAccount":"B","amount":100,"category":"food","time":"2018-03-02T10:34:30.000Z"},{"id":4,"sourceAccount":"A","targetAccount":"B","amount":100,"category":"food","time":"2018-03-02T10:36:00.000Z"}],[{"id":5,"sourceAccount":"A","targetAccount":"C","amount":250,"category":"other","time":"2018-03-02T10:33:00.000Z"},{"id":6,"sourceAccount":"A","targetAccount":"C","amount":250,"category":"other","time":"2018-03-02T10:33:05.000Z"}]];

var result = transactions.map((tr, i) => {
  return tr.filter((t, j) => {
    if (transactions[i][j - 1]) {
      var d1 = new Date(t.time);
      var d2 = new Date(transactions[i][j - 1].time);
      return (d1.getTime() - d2.getTime()) <= 60000;
    }

    return true;
  });
});

console.log(result);

关于javascript - 如何比较数组中的连续日期/时间项并根据特定时间进行过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51457829/

相关文章:

javascript - 如何在 angucomplete-alt 插件中添加 Cross 'X' 图标?

javascript - Gatsby 的 StaticImage 未在 Storybook 中呈现

java - 使用计数器在数组中搜索用户输入的单词

arrays - 按最大距离排序数组

javascript - 无法使用 Node 安装手写笔

javascript - Node.js puppeteer - 如何从表中仅获取某些(过滤器)记录

javascript - 对数组中的值进行分组和计数

在 iOS Safari 上要避免的 JavaScript 构造/模式?

java - 使用 printf() 将输出格式化为网格

javascript - 无法从 NodeJS 中的 Promise 更新全局变量