filtering 2d arrays using javascript

前端 未结 5 1923
眼角桃花
眼角桃花 2021-01-28 06:23

I have a 2D array where I need to filter the rows having date field (3d column)

var data = [
[\'1\',\'a\',\'12-12-2019\',\'A\'],
[\'2\',\'b\',\'\',\'A\'],
[\'3\'         


        
相关标签:
5条回答
  • 2021-01-28 07:03

    When it comes to speed for loop is fastest as your value to match is always at fixed index so you can just directly check and value and push your data

    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)

    0 讨论(0)
  • 2021-01-28 07:08

    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)

    If you really care the time, then use c++, c, rust or anything, btw, JS is the fastest interpreted language.

    0 讨论(0)
  • 2021-01-28 07:14

    It seems pretty straightforward to just use Array.filter, checking to see if the date field is empty or not.

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

    0 讨论(0)
  • 2021-01-28 07:20

    I wouldn't worry about using a loop to do that - this is what loops are for.

    You could just use Array.prototype.filter() to make sure that there's a value in the 2nd position of each array, returning whether it's truthy or not.

    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);
    
    0 讨论(0)
  • 2021-01-28 07:26

    Use Array#filter method with Array#some method.

    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)

    For the older browser, you can just do it with Array#filter method.

    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)


    If you just want to check the 3rd element always then there isn't any need of the nested loop.

    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)

    0 讨论(0)
提交回复
热议问题