[英]filtering 2d arrays using javascript
我有一个二维数组,我需要在其中过滤具有日期字段(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'],
];
使用 for 循环进行 comprisons 是时间密集型的,有没有最快的检索方法?
我不会担心使用循环来做到这一点 - 这就是循环的用途。
您可以只使用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);
只使用 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);
将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)
如果您只想始终检查第三个元素,则不需要嵌套循环。
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)
当谈到速度时, 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)
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是最快的解释型语言。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.