Как отфильтровать массив с элементами другого массива? - PullRequest
1 голос
/ 30 сентября 2019

У меня есть массив строк, которые я хочу отфильтровать по другому массиву слов. Цель состоит в том, чтобы удалить всю строку, если она содержит одно слово второго аргумента.

Давайте возьмем это как пример :

comments = [ "Very useful tutorial, thank you so much!",
  "React is not a damn framework, it's a LIBRARY"
  "Why you put bloody kitten pictures in a tech tutorial is beyond me!",
  "Which one is better, React or Angular?",
  'There is no "better", it depends on your use case, DAMN YOU'
]

bannedWords = ['bloody', 'damn']

Мой код возвращаетсяполный массив comments, я не понимаю, как я могу фильтровать все элементы массива bannedWords. Я почти уверен, что мне не хватает базовых вещей, но сейчас я застрял на некоторое время, поэтому ... Спасибо!

Вот что я кодировал:

  return comments.filter(comment => comment.includes(bannedWords) == false)
};

Ответы [ 4 ]

3 голосов
/ 30 сентября 2019
function filterOffensiveComments(comments, bannedWords) {
  return comments.filter(comment => !bannedWords.some(word => comment.includes(word)));
}

.includes принимает только один String. Используйте some, а не every, потому что он вернется раньше.

2 голосов
/ 30 сентября 2019

Проверьте, не включены ли .every запрещенных слов в комментарий, который вы просматриваете. Обязательно сначала наберите toLowerCase в комментарии:

const comments = ["Very useful tutorial, thank you so much!", "React is not a damn framework, it's a LIBRARY",
  "Why you put bloody kitten pictures in a tech tutorial is beyond me!", "Which one is better, React or Angular?", 'There is no "better", it depends on your use case, DAMN YOU'];
const bannedWords = ['bloody', 'damn'];

const result = comments.filter(comment => bannedWords.every(word => !comment.toLowerCase().includes(word)))
console.log(result);

Или, если вы хотите построить регулярное выражение:

const comments = ["Very useful tutorial, thank you so much!", "React is not a damn framework, it's a LIBRARY",
  "Why you put bloody kitten pictures in a tech tutorial is beyond me!", "Which one is better, React or Angular?", 'There is no "better", it depends on your use case, DAMN YOU'];
const bannedWords = ['bloody', 'damn'];
const re = new RegExp(bannedWords.join('|'), 'i');

const result = comments.filter(comment => !re.test(comment));
console.log(result);
0 голосов
/ 30 сентября 2019

Пытался реализовать с помощью обратного вызова -

const comments = [ "Very useful tutorial, thank you so much!",
  "React is not a damn framework, it's a LIBRARY",
  "Why you put bloody kitten pictures in a tech, tutorial is beyond me!",
  "Which one is better, React or Angular?",
  'There is no "better", it depends on your use case, DAMN YOU'
];

const bannedWords = ['bloody', 'damn'];

function getFilteredResults(item, index, array){
var flag = 0;
bannedWords.forEach(bannedWord => {
if(item.toLowerCase().indexOf(bannedWord.toLowerCase()) != -1)
    flag = 1;
});
return flag == 0;
}

comments.filter(getFilteredResults);
0 голосов
/ 30 сентября 2019
function filterOffensiveComments(comments, bannedWords) {
  return comments.filter(item=>{
    let shouldDelete = false;
    bannedWords.forEach(word=>{
        if(item.includes(word)){
            shouldDelete = true;
        }
    })
    if(shouldDelete){
        return null
    }
    return item;
  })
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...