#javascript
#javascript
Вопрос:
Интересно, какой самый чистый способ фильтрации массива, содержащего сочетание строк и чисел, чтобы получить наилучший результат на основе параметра функции.
У меня есть этот массив
const vehicles = [{
Brand: 'Peugeot',
Type: 'Car',
Modelo: '206',
Puertas: 4,
Precio: 200000
},
{
Brand: 'Honda',
Type: 'Motorcycle',
Modelo: 'Titan',
Cilindrada: '125cc',
Precio: 60000
},{
Brand: 'Peugeot',
Type: 'Car',
Modelo: '208',
Puertas: 5,
Precio: 250000
},{
Brand: 'Yamaha',
Type: 'Motorcycle',
Modelo: 'YBR',
Cilindrada: '160cc',
Precio: 80500
}]
И я хочу, например, когда я ищу ‘y’, функция возвращает
{
Brand: 'Yamaha',
Type: 'Motorcycle',
Modelo: 'YBR',
Cilindrada: '160cc',
Precio: 80500
}
Моим первым подходом была эта функция
function filterByValue(array, value) {
return array.filter((data) => JSON.stringify(data).toLowerCase().indexOf(value.toLowerCase()) !== -1);
}
Но он возвращает весь vehicles
массив
Комментарии:
1. Да, причина, по которой возвращается весь массив vehicles, заключается в том, что он также соответствует ключам
2. Вы хотите, чтобы он выполнял поиск только по бренду? Потому что в вашем примере поиск «y» также должен возвращать другой код «y».
Ответ №1:
Вы можете искать значения, которые при преобразовании в строки содержат искомую подстроку:
const vehicles = [{
Brand: 'Peugeot',
Type: 'Car',
Modelo: '206',
Puertas: 4,
Precio: 200000
},
{
Brand: 'Honda',
Type: 'Motorcycle',
Modelo: 'Titan',
Cilindrada: '125cc',
Precio: 60000
},{
Brand: 'Peugeot',
Type: 'Car',
Modelo: '208',
Puertas: 5,
Precio: 250000
},{
Brand: 'Yamaha',
Type: 'Motorcycle',
Modelo: 'YBR',
Cilindrada: '160cc',
Precio: 80500
}];
const input = 'y'.toLowerCase();
console.log(
vehicles.filter(
vehicle => Object.values(vehicle).some(
val => String(val).toLowerCase().includes(input)
)
)
);
Если вы хотите быть более прихотливым, вы могли бы отсортировать результаты по наибольшему количеству вхождений подстроки, или придать дополнительный вес значениям, начинающимся с входных данных, или отсортировать по расстоянию Левенштейна от входных данных.
Комментарии:
1. Эта функция никогда не найдет никаких записей, содержащих заглавную букву as
input
.
Ответ №2:
Следующая реализация использует вашу JSON.stringify
логику, но применяет ее только к values
каждому объекту.
const vehicles = [
{
Brand: "Peugeot",
Type: "Car",
Modelo: "206",
Puertas: 4,
Precio: 200000,
},
{
Brand: "Honda",
Type: "Motorcycle",
Modelo: "Titan",
Cilindrada: "125cc",
Precio: 60000,
},
{
Brand: "Peugeot",
Type: "Car",
Modelo: "208",
Puertas: 5,
Precio: 250000,
},
{
Brand: "Yamaha",
Type: "Motorcycle",
Modelo: "YBR",
Cilindrada: "160cc",
Precio: 80500,
},
];
function filterByValue(array, value) {
return array.filter(
(data) =>
JSON.stringify(Object.values(data))
.toLowerCase()
.indexOf(value.toLowerCase()) !== -1
);
}
console.log(filterByValue(vehicles, "y"));
Ответ №3:
Это будет проверять value
только значения свойств объектов в вашем массиве:
const vehicles = [{
Brand: 'Peugeot',
Type: 'Car',
Modelo: '206',
Puertas: 4,
Precio: 200000
},
{
Brand: 'Honda',
Type: 'Motorcycle',
Modelo: 'Titan',
Cilindrada: '125cc',
Precio: 60000
}, {
Brand: 'Peugeot',
Type: 'Car',
Modelo: '208',
Puertas: 5,
Precio: 250000
}, {
Brand: 'Yamaha',
Type: 'Motorcycle',
Modelo: 'YBR',
Cilindrada: '160cc',
Precio: 80500
}
]
const filterByValue = (array, value) => {
return array.filter((data) =>
Object.values(data).some((val) =>
val.toString().toLowerCase().includes(value.toLowerCase()),
)
)
}
console.log(filterByValue(vehicles, 'y'));