使用javascript过滤2d数组

时间:2019-04-13 14:29:06

标签: javascript arrays multidimensional-array

我有一个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'],
];

为囚犯使用循环非常耗时,是否有最快的检索方法?

5 个答案:

答案 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);