我有一个2D数组,需要过滤具有日期字段(3d列)的行
var data = [
['1','a','12-12-2019','A'],
['2','b','','A'],
['3','c','12-1-2019','A'],
['4','d','','A'],
];
预期结果是
result = [
['1','a','12-12-2019','A'],
['3','c','12-1-2019','A'],
];
为囚犯使用循环非常耗时,是否有最快的检索方法?
答案 0 :(得分:2)
我不会担心使用循环来做到这一点-这就是循环的用途。
您可以只使用Array.prototype.filter()来确保每个数组的第二个位置都有一个值,并返回是否为真。
var data = [
['1','a','12-12-2019','A'],
['2','b','','A'],
['3','c','12-1-2019','A'],
['4','d','','A'],
];
// Used a classic `function` keyword because you're using this in a Google apps script
const result = data.filter(function(item) {
return item[2];
});
console.log(result);
答案 1 :(得分:1)
将Array#filter
方法与Array#some
方法一起使用。
var data = [
['1', 'a', '12-12-2019', 'A'],
['2', 'b', '', 'A'],
['3', 'c', '12-1-2019', 'A'],
['4', 'd', '', 'A'],
];
// check any of the string matched date pattern
let res = data.filter(arr => arr.some(str => /^\d{1,2}-\d{1,2}-\d{4}$/.test(str)))
console.log(res)
对于较旧的浏览器,您只需使用Array#filter
方法即可。
var data = [
['1', 'a', '12-12-2019', 'A'],
['2', 'b', '', 'A'],
['3', 'c', '12-1-2019', 'A'],
['4', 'd', '', 'A'],
];
var res = data.filter(function(arr) {
// check length of date formated elements
return arr.filter(function(str) {
return /^\d{1,2}-\d{1,2}-\d{4}$/.test(str)
}).length;
});
console.log(res)
如果您只想始终检查第3个元素,则不需要嵌套循环。
var data = [
['1', 'a', '12-12-2019', 'A'],
['2', 'b', '', 'A'],
['3', 'c', '12-1-2019', 'A'],
['4', 'd', '', 'A'],
];
var res = data.filter(function(arr) {
// check 3rd value is correct date value
return /^\d{1,2}-\d{1,2}-\d{4}$/.test(arr[0])
// if value would be empty all other case then simply
// return the value since empty values are falsy
// return arr[2];
});
console.log(res)
答案 2 :(得分:1)
在速度方面,for
循环最快,因为您要匹配的值始终处于固定索引,因此您可以直接检查和评估值并推送数据
var data = [['1','a','12-12-2019','A'],['2','b','','A'],['3','c','12-1-2019','A'],['4','d','','A'],];
let op = []
for(let i=0; i<data.length; i++){
if(!data[i][2]){
op.push(data[i])
}
}
console.log(op)
答案 3 :(得分:1)
var data = [
['1','a','12-12-2019','A'],
['2','b','','A'],
['3','c','12-1-2019','A'],
['4','d','','A'],
];
d = data.filter(i => i[2].match(/\d\d?\-\d\d?\-\d{4}/))
console.log(d)
如果您真的很在意时间,请使用c ++,c,rust或其他任何东西,顺便说一句,JS是最快的解释语言。
答案 4 :(得分:1)
仅使用Array.filter来检查日期字段是否为空似乎很简单。
var data = [
['1','a','12-12-2019','A'],
['2','b','','A'],
['3','c','12-1-2019','A'],
['4','d','','A'],
];
var filtered = data.filter(e => e[2]);
console.log(filtered);