Фильтровать объекты JSON на основе переменной массива с несколькими атрибутами в javascript

Контекст Я использую: Windows 11, VSCode и узел v18.12.1

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

Вопрос У меня есть следующий код, который фильтрует на основе имени одного пользователя. Что я хочу сделать, так это фильтровать на основе совпадения одного или нескольких имен.

Вот код, который работает с фильтрацией по имени одного владельца

let carOwners = [{ "name": "Phil", "age": 52, "car": null },
{ "name": "Carl Phil", "age": 25, "car": "Tesla" },
{ "name": "Bob", "age": 65, "car": "Land Rover" },
{ "name": "Megan", "age": 34, "car": "Mercedez" },
{ "name": "Charlene", "age": 67, "car": "Mazda" }]

checkUsers = carOwners.filter(user => !(user.name.includes("Phil")));

console.info(checkUsers);

что дает результат:

[
  { name: 'Bob', age: 65, car: 'Land Rover' },
  { name: 'Megan', age: 34, car: 'Mercedez' },
  { name: 'Charlene', age: 67, car: 'Mazda' }
]

Что я хочу сделать, так это отфильтровать любые результаты, содержащие Фила или Боба.

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

Это первый опробованный метод:

filteredNames = ['Phil', 'Bob'];

checkUsers = carOwners.filter(user => !(user.name.includes(filteredNames)));

console.info(checkUsers);

Результат, который мне нужен:

[
  { name: 'Megan', age: 34, car: 'Mercedez' },
  { name: 'Charlene', age: 67, car: 'Mazda' }
]

кроме того, что я получаю:

[
  { name: 'Phil', age: 52, car: null },
  { name: 'Carl Phil', age: 25, car: 'Tesla' },
  { name: 'Bob', age: 65, car: 'Land Rover' },
  { name: 'Megan', age: 34, car: 'Mercedez' },
  { name: 'Charlene', age: 67, car: 'Mazda' }
]

Я пробовал множество других, самое близкое, что я получил, было основано на решении здесь Я пробовал следующее:

const filteredNames = ['Phil', 'Bob'];

let checkUsers = carOwners.filter(a => !(filteredNames.includes(a.name + '')));

console.info(checkUsers);

который ближе (поскольку он отфильтровывает объекты с именами Боб и Фил), однако мне все еще возвращается объект «Карл Фил», как вы можете видеть ниже... Вопрос, который у меня есть, заключается в том, как мне отфильтровать любой объект который содержит любое появление любого из имен в массиве filteredNames, так что у меня остались объекты с именем «Меган» и «Шарлин»?

[
  { name: 'Carl Phil', age: 25, car: 'Tesla' },
  { name: 'Megan', age: 34, car: 'Mercedez' },
  { name: 'Charlene', age: 67, car: 'Mazda' }
]

Любые советы приветствуются. заранее спасибо

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
247
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Поскольку вам нужно filter вхождение заданных имен в любом месте строки, хороший способ — использовать регулярные выражения. В этом случае мы ищем name, которые не matchsome из filteredNames.

Для этого вы можете использовать комбинацию Array.prototype.some() и String.prototype.match().

let carOwners = [{ "name": "Phil", "age": 52, "car": null },
{ "name": "Carl Phil", "age": 25, "car": "Tesla" },
{ "name": "Bob", "age": 65, "car": "Land Rover" },
{ "name": "Megan", "age": 34, "car": "Mercedez" },
{ "name": "Charlene", "age": 67, "car": "Mazda" }]

let filteredNames = ['Phil','Bob']

let newObj = carOwners.filter(({name}) =>
    !filteredNames.some(filtered => name.match(filtered)))

console.info(newObj)

Более разумное решение — использовать регулярное выражение, поскольку testing_22 опубликовано.
Следующие коды не крутые, но более понятные для людей, которые не любят регулярные выражения :)

const carOwners = [
  { "name": "Phil", "age": 52, "car": null },
  { "name": "Carl Phil", "age": 25, "car": "Tesla" },
  { "name": "Bob", "age": 65, "car": "Land Rover" },
  { "name": "Megan", "age": 34, "car": "Mercedez" },
  { "name": "Charlene", "age": 67, "car": "Mazda" }
];

const filteredNames = ['Phil', 'Bob'];

const checkUsers = carOwners.filter(({name}) => {
  for (const [index, eachName] of filteredNames.entries()) {
    if (name.includes(eachName)) {
      return false;
    }
  }
  return true;
});

console.info(checkUsers);

Спасибо, @shin! Спасибо за предоставленную альтернативу, но, как вы сказали, мне нужно краткое выражение, которое дает решение @testing_22 :)

e-driver1 25.11.2022 07:23

Я рад, что ваша проблема решена с помощью регулярного выражения. Надеюсь, ваше приложение пойдет хорошо :)

Shin 28.11.2022 02:08

Другие вопросы по теме