JavaScript从数组中删除元素直到x

3

我从后端收集了时间数组[09:00, 09:30, 10:00, 10:30]...,我想过滤掉所有早于和包括12:00的时间。

我该如何操作?

我考虑使用$.each遍历数组,并将字符串相互比较,但我不确定这是否是正确的方法。


这些时间是有序的吗? - ojovirtual
是的,它们是有序的。 - jbehrens94
你们的时间格式是什么?你提供的符号不是有效的JavaScript。如果它是字符串,那么格式应该是["09:00", "09:30", "10:00", "10:30"]。在这种情况下,@VisioN的第一个答案可以起作用,并且我投了赞成票。 - wintvelt
6个回答

5

到目前为止,这是唯一一个能够过滤掉数组中没有 12:00 的时间的答案:

var array = ['09:00', '09:30', '10:00', '10:30', '12:00', '12:30', '13:00'];

var result = array.filter(function(e) {
    var date = new Date('1.1.2000 ' + e),  // create Date object
        hours = date.getHours();           // get hours from time

    return hours > 12 || (hours === 12 && date.getMinutes() > 0);
});

console.log( result );  // ["12:30", "13:00"]

如果不依赖于Date对象,我们可以使用简单的字符串操作:

var result = array.filter(function(e) {
    var date = e.split(':'),  // split time by ':'
        hours = +date[0];     // get hours as a number

    return hours > 12 || (hours === 12 && +date[1] > 0);
});

console.log( result );  // ["12:30", "13:00"]

另外一个更为直接的解决方法是将时间转换为数字,然后过滤掉所有小于或等于 1200 的内容:
var result = array.filter(function(e) {
    return +e.replace(':', '') > 1200;
});

console.log( result );  // ["12:30", "13:00"]

1
这个解决方案非常棒,不仅因为它能够实现预期功能,而且即使数组没有排序,它仍然可以正常工作。 - ojovirtual
非常全面的解决方案,我想感谢你:D - jbehrens94

2
如果数组已经排序,并且始终存在值'12:00',那么您可以使用索引和slice()方法,例如:

var array = ['09:00', '09:30', '10:00', '10:30', '11:00', '11:30'];
var newarray = array.slice(array.indexOf('10:00') + 1);
snippet.log(JSON.stringify(newarray))
<!-- Provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>


如果您不确定值的存在,则需要遍历数组并进行过滤。

var array = ['09:00', '09:30', '10:00', '10:30', '11:00', '11:30'];
var newarray = array.filter(function(item) {
  return item > '10:00'
});
snippet.log(JSON.stringify(newarray))
<!-- Provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>


值“12:00”并不总是存在,它可以是任何时间,但如果最高值是“11:30”,则应该过滤掉之前的所有值。 - jbehrens94
因此,它应该检查最多到 12:00,如果这样更清楚。 - jbehrens94
值得注意的是,尽管在当前情况下字符串比较可以正常工作,但对于不同时间(特别是格式不同时),它可能会出错,例如'9:00' > '10:00' === true - VisioN

1
这种方法依赖于时间字符串始终按照以下格式进行格式化:HH:mm
它将遍历数组中的所有项,并删除小于或等于'12:00'的元素。

var times = ['09:00', '09:30', '10:00', '10:30', '12:30'];

for (var i = 0; i < times.length; i++) {
    if (times[i] <= '12:00') {
        times.splice(i--, 1);
    }
}

document.body.innerHTML = JSON.stringify(times);
// Running this code snippet will output ["12:30"]


1
你的数据是什么格式?如果它们是字符串且数组已排序,你可以简单地找到包含“12:00”文本的元素的索引,并从该位置开始切割数组。
arr.splice(arr.indexOf('12:00') + 1);

0

尝试使用filter函数:

var times = ['09:00', '09:30', '10:00', '10:30', '11:00', '11:30', '12:00', '12:30']
,   latestTime = breakUpTime('12:00')
,   result = ''
;
var newTimes = times.filter(function(time){
    var thisTime = breakUpTime(time);
    return thisTime['hour'] < latestTime['hour'] || (thisTime['hour'] == latestTime['hour'] && thisTime['minute'] <= latestTime['minute']);
});
function breakUpTime(time) {
    var parts = time.split(':');
    return {'hour' : parseInt(parts[0]), 'minute' : parseInt(parts[1])};
}
for(var time = 0; time < newTimes.length; time ++) {
    result += newTimes[time] + '<br/>';
}
document.write(result);


0

如果存在 12.00:

my_array = backend_array.slice(0, backend_array.index("12.00")+1)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接