我有一个对象数组,我想过滤一个字符串。所以我想检查多个属性,如果它们包含过滤字符串(不区分大小写)。
这是数组:
[{
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;
}
);
你能想到一种更快/更清洁的方法吗?
答案 0 :(得分:1)
我认为你不能更快地做到这一点,但更清洁可能是那样的
const filterString = this.filterString.toLowerCase();
return myObjects.filter((entry) => {
return Object.values(entry).some((value) => {
return value.toLowerCase().includes(filterString)
})
});
答案 1 :(得分:0)
如果允许在对象中添加其他属性,也许可以将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
的前几个字符一起产生匹配。这就是我在这里使用:
分隔符的原因,假设这是一个不能出现在ID或短名称中的字符。
答案 2 :(得分:0)
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.log(filter(objects, "0123"));
console.log(filter(objects, "obj"));
console.log(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.log(filterRegex(objects, "0123"));
console.log(filterRegex(objects, "obj"));
console.log(filterRegex(objects, "mO01"));