Самый быстрый способ фильтровать объект по нескольким свойствам

У меня есть массив объектов, которые я хочу отфильтровать по строке. Поэтому я хочу проверить несколько свойств, если они содержат строку фильтра (без учета регистра).

Вот массив:

[{
  id: "01234", 
  name: "My Object 01234", 
  short_name: "MO01234"
}, ...]

Таким образом, все следующие строки фильтра должны соответствовать этому объекту: 0123, obj, mO01 и т. д.

Вот что у меня сейчас:

const filterString = this.filterString.toLowerCase();
return myObjects.filter(
  entry => {
    return 
      entry.id.toLowerCase().indexOf(filterString) >= 0 || 
      entry.name.toLowerCase().indexOf(filterString) >= 0 ||    
      entry.short_name.toLowerCase().indexOf(filterString) >= 0;
  }
);

Можете ли вы придумать более быстрый / чистый способ сделать это?

Пожалуйста, прочтите В чем разница между JSON и Object Literal Notation?

str 24.04.2018 10:53
Поведение ключевого слова "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
1
68
3

Ответы 3

Если вам разрешено помещать дополнительные свойства в свой объект, возможно, вы могли бы объединить id, name и short_name (уже в нижнем регистре) в одну строку и сохранить ее в объекте как, например, search_key; тогда вам нужно только это проверить.

{
  id: "01234", 
  name: "My Object 01234", 
  short_name: "MO01234",
  search_key: "01234:my object 01234:mo01234"
}

return myObjects.filter(
  entry => entry.search_key.indexOf(filterString) >= 0
);

Одна вещь, о которой вы должны помнить в этом случае, - это предотвратить непреднамеренные совпадения, которые могут возникнуть, например, из-за последние несколько символов id и первые несколько символов name вместе дают совпадение. Вот почему я использовал здесь разделитель :, предполагая, что это символ, который не может появиться в идентификаторе или коротком имени.

Я не думаю, что можно сделать это быстрее, но чище может быть что-то в этом роде

const filterString = this.filterString.toLowerCase();
return myObjects.filter((entry) => {
    return Object.values(entry).some((value) => {
        return value.toLowerCase().includes(filterString)
    })
});

let objects = [{
    id: "01234", 
    name: "My Object 01234", 
    short_name: "MO01234"
},
{
    id: "test", 
    name: "test", 
    short_name: "test"
}];

const filter = (collection, searchFor) => {
    return collection.filter(obj => Object.values(obj).reduce((a,b) => a || String(b).toLowerCase().indexOf(searchFor.toLowerCase()) > -1, false))
}

console.info(filter(objects, "0123"));
console.info(filter(objects, "obj"));
console.info(filter(objects, "mO01"));

Вы также можете расширить эту функцию, чтобы использовать набор столбцов в качестве параметра для фильтрации.

Другая версия с использованием Regex:

const filterRegex = (collection, searchFor) => {
    return collection.filter(obj => Object.values(obj).reduce((a,b) => a || String(b).match(new RegExp(searchFor, 'gi')), false))
}


console.info(filterRegex(objects, "0123"));
console.info(filterRegex(objects, "obj"));
console.info(filterRegex(objects, "mO01"));

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