Контекст Я использую: 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' }
]
Любые советы приветствуются. заранее спасибо
Поскольку вам нужно filter
вхождение заданных имен в любом месте строки, хороший способ — использовать регулярные выражения. В этом случае мы ищем name
, которые не match
some
из 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 :)