У меня есть массив объектов, которые я хочу отфильтровать по строке. Поэтому я хочу проверить несколько свойств, если они содержат строку фильтра (без учета регистра).
Вот массив:
[{
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;
}
);
Можете ли вы придумать более быстрый / чистый способ сделать это?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Если вам разрешено помещать дополнительные свойства в свой объект, возможно, вы могли бы объединить 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"));
Пожалуйста, прочтите В чем разница между JSON и Object Literal Notation?