数组滤镜元素彼此太接近了

时间:2017-09-26 13:41:27

标签: javascript arrays lodash

我有以下

df1 = pd.DataFrame({ 'Column1':['s','g','h','word2','d','f','word1','d']})

a = df1.Column1.isin(['word1','word2']).idxmax()
print (a)
3

我想删除中间日期,因为它太接近前一个日期(不到一小时)。一旦删除,第三个应该留在那里,因为它不太接近前一个(现在是第一个)

我知道如何转换日期,我知道如何制作一个基本的for循环来查找要删除的日期,我知道如何删除它。

我的问题是:是否有任何一个班轮可以解决这个问题?我正在查看lodash,但无法找到任何

澄清:

数组始终排序。该函数应该验证当前元素与前一个元素的对比。如果删除当前元素,则应将下一个元素与移除的元素进行比较

3 个答案:

答案 0 :(得分:4)

单线,可能不是,但你可以这样做:

var last = -Infinity, threshold = 60 * 60 * 1000;
var result = dates.filter(function(date) {
    var time = Date.parse(date);
    if( time - last < threshold) return false;
    last = time;
    return true;
});

这会跟踪上一个时间戳,允许filter调用引用它。

答案 1 :(得分:4)

不是单行,但它不长:

let lastDate = null;
dates = dates.filter(date => {
  date = parseDate(date);
  if (!lastDate || date - lastDate >= ONE_HOUR) {
    lastDate = date;
    return true;
  }
});

&#13;
&#13;
let dates = [
    "2017-09-11 13:30:45", 
    "2017-09-11 14:20:00", 
    "2017-09-11 15:00:00"
    ];
const ONE_HOUR = 1000 * 60 * 60;
let lastDate = null;
dates = dates.filter(date => {
  date = parseDate(date);
  if (!lastDate || date - lastDate >= ONE_HOUR) {
    lastDate = date;
    return true;
  }
});
console.log(dates);

function parseDate(s) {
  return Date.parse(s.replace(' ', 'T'));
}
&#13;
&#13;
&#13;

答案 2 :(得分:0)

如果您希望以后获得更多控制权,可以使用更受欢迎的date time解析库,例如moment.js。它会使您的代码更加 可读 可维护

var dates = [
  "2017-09-11 13:30:45",
  "2017-09-11 14:20:00",
  "2017-09-11 15:00:00"
];

var TIME_DIFF = 45; //minutes

for (var i = 0; i < dates.length - 1; i++) {
  if (Math.abs(moment(dates[i + 1]).diff(moment(dates[i]), 'minutes')) > TIME_DIFF) {
    dates.splice(i + 1, 1);
  }
}

console.log(dates);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.js"></script>

更多细节可以在这里找到 https://momentjs.com/