фильтрация 2d массивов с использованием JavaScript - PullRequest
0 голосов
/ 13 апреля 2019

У меня есть 2D-массив, где мне нужно отфильтровать строки, имеющие поле даты (3-й столбец)

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 для составных частей требует много времени. Существует ли самый быстрый способ получения?

Ответы [ 5 ]

2 голосов
/ 13 апреля 2019

Я бы не стал беспокоиться об использовании цикла для этого - для этого нужны циклы.

Вы можете просто использовать Array.prototype.filter () , чтобы убедиться, чтово 2-й позиции каждого массива есть значение, возвращающее, истинно оно или нет.

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 голос
/ 13 апреля 2019

Кажется довольно простым использовать 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);
1 голос
/ 13 апреля 2019

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 - самый быстрый интерпретируемый язык.

1 голос
/ 13 апреля 2019

Когда дело доходит до скорости 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)
1 голос
/ 13 апреля 2019

Используйте 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...