#javascript #arrays #filter
Вопрос:
Я возюсь с примером кода на странице MDN, детализирующим Array.prototype.filter (), и нахожу, что происходит что-то интересное.
Я изменил пример кода, чтобы он был следующим:
const words = ['spray', 'limit', 'elite', 'exuberant', 'destruction', 'present'];
const result = words.filter(word => word.includes('e', 'i'));
console.log(result);
// expected output: const result = words.filter(word => word.includes('e', 'i'));
console.log(результат);
// ожидаемый результат: Массив [«элита», «изобилие», «разрушение», «настоящее»]
И это работает, однако, когда я изменяю его так, чтобы эти два символа находились в переменной (либо объявленной с const
помощью ИЛИ var
)…
const words = ['spray', 'limit', 'elite', 'exuberant', 'destruction', 'present'];
var test = ['e', 'i'];
const result = words.filter(word => word.includes(test));
console.log(result);
// expected output: Array ["elite", "exuberant", "destruction", "present"]
// ACTUAL OUTPUT: Array []
Наконец, если я изменюсь test
на test[0,1]
, я получу первый результат — как и ожидалось.
Другие похожие вопросы, похоже, мне не помогли, и я не совсем уверен, что здесь происходит и как я могу заставить это работать.
Комментарии:
1. включает(«e», «i») не то же самое, что включает ([«e», «i»])
2. замените .inculdes(тест) на .includes(…тест).
3. Реальная проблема в том, что вы никогда не соответствуете
i
здесь, поэтому версия без переменной также неверна.
Ответ №1:
Проблема в том, что версия с переменной делает не то же самое, что версия без переменной.
word.includes('e', 'i')
это не то же самое, что word.includes(['e', 'i'])
(хотя и не делайте того, что вы думаете, как указано ниже).
Если вы хотите сохранить свои аргументы в массиве и применить их в качестве нескольких аргументов (разбросанных) в вызове функции , а не в качестве одного аргумента массива, вы можете использовать синтаксис разброса:
const words = ['spray', 'limit', 'elite', 'exuberant', 'destruction', 'present'];
var test = ['e', 'i'];
const result = words.filter(word => word.includes(...test));
console.log(result);
Реальная проблема
Реальная проблема здесь в том, что вы неправильно вызываете функцию. Проверьте документы MDN на наличие строки#включает:
includes(searchString)
Строка поиска Строка для поиска в str.
Эта функция принимает только один параметр. Поэтому , когда вы word.includes('e', 'i')
, вы не должны ожидать, что он будет соответствовать словам, в которых есть «я». Только «е».
Если вы хотите сопоставить слова, содержащие все строки, с которыми вы хотите сопоставить, вам нужно переделать свою логику:
const words = ['spray', 'limit', 'elite', 'exuberant', 'destruction', 'present'];
const test = ['e', 'i'];
const containsAll = words.filter( word => test.every (str => word.includes(str)))
const oneOf = words.filter( word => test.some (str => word.includes(str)))
console.log(containsAll);
console.log(oneOf);
Комментарии:
1. Да, я только что проверил
...
это с помощью приведенного выше комментария, однако я обнаружил новую проблему. с простыми символами это, кажется, работает нормально, однако , если бы я изменил его такимvar test = ['elite', 'limit'];
образом, я получил["elite"] as the result. If I swap the order, so
бы ограничение » сначала, результат таков["limit"]
. Если я разделяю буквы на отдельные символы, это иногда срабатывает. если бы я должен был ввестиvar test = ['s', 'eli']
, он, похоже, игнорирует «eli» и просто возвращает все, что соответствует букве «s»…2. @Энтони, Это СОВЕРШЕННО другая проблема, на самом деле, со своими собственными проблемами. Первый вопрос касается сопоставления слов, содержащих отдельные символы. Ваш следующий вопрос второй вопрос начинает делать что-то совсем другое. Однако главная проблема заключается в том, что вы используете функцию не по назначению. Для сопоставления этой функции требуется только один аргумент, а не несколько. У него есть необязательный второй аргумент, но это только для начальной позиции. Я обновлю ответ.
3. Там. Смотрите полные решения
4. Ну, в любом случае это, вероятно, более эффективно, чем использование регулярных выражений. На этой ноте я прочитал «Освоение регулярных выражений» Фридла 15 лет назад (во время учебы), и это очень помогло мне освоить различные диалекты регулярных выражений. Очень хорошая инвестиция времени и денег, просто прочитав первые несколько глав! Но я в замешательстве; разве мой последний код не устранил вашу проблему? Он будет работать со всеми типами строк, сопоставляя все наборы слов, содержащие либо ВСЕ строки, либо ЛЮБУЮ из строк (я предоставил обе версии).
5. Я действительно не видел этого, когда комментировал, так что либо это была правка, либо я просто очень умный /ы (никогда не говорил, что я умный!) Но серьезно, спасибо тебе!