Фильтрация массива на основе другого массива в скрипте Google Apps - PullRequest
2 голосов
/ 09 мая 2020

Я новичок в JavaScript и могу нуждаться в помощи с проблемой, с которой я столкнулся при работе над скриптом Google Apps.

То, что я собираюсь сделать, это фильтровать мои данные на основе массива, который я беру из определенной c ячейки в определенном c листе, который содержит строковые элементы, которые мне не нужны сохранить в моих данных. Другими словами, строки, содержащие эти ключевые слова, должны быть удалены с моего листа.

До сих пор мне удавалось сделать это, используя единственный строковый элемент в моей функции фильтрации.

// elements to filter out.
var keys = [['a','b','c']];

// example data.
var data = [['a',1,2],
            ['c',4,3],
            ['d',3,4]];

// my approach for a single element which works.
var filterText = "a";
var newData1 = data.filter(function(item) {
  return item[0] !== filterText;
});
console.log(newData1); // output: [ [ 'c', 4, 3 ], [ 'd', 3, 4 ] ]

Однако , если я попытаюсь расширить этот logi c на случай, когда я использую массив для фильтрации своих данных, у меня проблемы. Я написал приведенный ниже код, который правильно проверяет мои данные, но не возвращает ожидаемого результата. Я знаю, что упускаю важную часть кода здесь, но не могу понять, какая именно. Я несколько раз перевернул код, но все равно застрял.

for(var n=0; n<keys[0].length; n++) {
  // console.log(keys[0][n]);
  var newData2 = data.filter(function(item) {
    // console.log(item[0] === keys[0][n]);
     return item[0] === keys[0][n];
  })
};
console.log(newData2); // output: [ [ 'c', 4, 3 ] ]

Надеюсь, вы, ребята, укажете мне верное направление и поможете понять, в чем я делаю здесь свою ошибку.

Спасибо!

Ответы [ 3 ]

2 голосов
/ 09 мая 2020

Я бы создал объект со всеми вашими нежелательными ключами, а затем использовал бы их для фильтрации вашего массива данных.

const ObjectOfKeys = keys.reduce((acc,rec)=> {
                        let nextAcc = acc;
                        nextAcc[rec] = true;
                        return nextAcc;
                        },{}};

const filteredData = data.filter(rec => !ObjectKeys[rec[0]])

в качестве альтернативы вы могли бы пропустить создание объекта, если бы ваши ключи были уникальными .

const filterData = data.filter (re c =>! Keys.includes (re c)) Примечание. это не сработает, если, например, ваш ключ - «яблоко», а data [0] - «а», поэтому первый подход гарантирует, что такие условия не сбрасывают код.

1 голос
/ 09 мая 2020

Создайте Набор ключей и используйте set.has:

// elements to filter out.
const keys = [['a','b','c']],
keySet = new Set(keys[0]),

// example data.
data = [['a',1,2],
        ['c',4,3],
        ['d',3,4]],
out = data.filter(([item0])=>!keySet.has(item0));
console.info(out);
1 голос
/ 09 мая 2020

Попробуйте следующее:

function myfunction() {
  var keys = [['a','b','c']][0];//flatten
  var data = [['a',1,2],['c',4,3],['d',3,4]];
  var d=0;
  for(var i=0;i-d<data.length;i++) {
    for(var j=0;j<data[i-d].length;j++) {
      if(keys.indexOf(data[i-d][j])!=-1) {
        data.splice(i-d++,1);//remove the row and increment the delete counter
        break;//break out of inner loop since row is deleted
      }
    }
  }
  console.log(data);
}

Спасибо за другие решения. Мне действительно нужно больше практики с другими методами массивов и стрелками. Просто для удовольствия я увеличил размер набора данных до 1200 строк и запустил разные методы бок о бок, а ниже - csv данных. Не совсем убедительный. Каждый раз это был один и тот же набор данных, и я использовал вывод console.log для всех из них. Данные получены из вывода выполнения представления.

Cooper,1.171
Cooper,1.195
Farnoosh,1.2
Farnoosh,1.224
Cooper,1.237
TheMaster,1.257
Cooper,1.264
Farnoosh,1.347
TheMaster,1.371
TheMaster,1.392
Cooper,1.503
Farnoosh,1.513
Farnoosh,1.563
TheMaster,1.699
TheMaster,1.936
...