【问题标题】:filtering 2d arrays using javascript使用javascript过滤二维数组
【发布时间】:2019-09-04 02:25:25
【问题描述】:

我有一个二维数组,我需要在其中过滤具有日期字段(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 循环进行压缩比较耗时,有没有最快的检索方法?

【问题讨论】:

  • 一个for循环...?
  • 不使用传统的 for 循环。
  • 我有 3000 行要过滤
  • for 循环在速度方面会是最快的,你还应该在什么基础上添加过滤数据?
  • @CodeGuy 添加了一个answer,您可以使用简单的 for 循环进行检查

标签: javascript arrays multidimensional-array


【解决方案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)

如果您只想始终检查第三个元素,则不需要嵌套循环。

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)

【讨论】:

  • 我实际上将它用于 Google 应用程序脚本,所以我不能使用 => 运算符
  • 还有一些方法不支持
  • @CodeGuy,所有这些都应该在您的问题中提及。我们不必在 cmets 中阅读这些要求。
【解决方案2】:

我不会担心使用循环来做到这一点 - 这就是循环的用途。

您可以只使用Array.prototype.filter() 来确保每个数组的第二个位置有一个值,返回它是否为真。

var data = [
  ['1','a','12-12-2019','A'],
  ['2','b','','A'],
  ['3','c','12-1-2019','A'],
  ['4','d','','A'],
];

// You're using a Google Apps script, so this is ES5
const result = data.filter(function(item) {
  return item[2];
});

console.log(result);

【讨论】:

    【解决方案3】:

    在速度方面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)

    【讨论】:

    • 你确定 while 循环不是最快的吗?
    • 或array.filter?
    • @charlietfl 很好,这取决于实现,我在大多数答案中都看到了一些答案here
    • 把它扔出去。没有性能测试很难知道。
    【解决方案4】:

    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 是最快的解释语言。

    【讨论】:

      【解决方案5】:

      使用 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);

      【讨论】:

        猜你喜欢
        • 2011-05-24
        • 1970-01-01
        • 1970-01-01
        • 2013-06-23
        • 1970-01-01
        • 2018-12-28
        • 2018-02-10
        • 1970-01-01
        相关资源
        最近更新 更多