通过多个属性过滤对象的最快方法

时间:2018-04-24 08:46:26

标签: javascript optimization

我有一个对象数组,我想过滤一个字符串。所以我想检查多个属性,如果它们包含过滤字符串(不区分大小写)。

这是数组:

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

因此,以下所有过滤字符串都应与该对象匹配:0123objmO01等。

这就是我现在所拥有的:

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;
  }
);

你能想到一种更快/更清洁的方法吗?

3 个答案:

答案 0 :(得分:1)

我认为你不能更快地做到这一点,但更清洁可能是那样的

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

答案 1 :(得分:0)

如果允许在对象中添加其他属性,也许可以将idnameshort_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"));