Самый чистый способ фильтрации массива строками и числами

#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'));