Javascript 如何在所有数组元素中创建搜索筛选器

Javascript 如何在所有数组元素中创建搜索筛选器,javascript,Javascript,我有这个 rows=[ {label1 : "abc", label2 : "bcd"}, {label3 : "cde", label4 : "dce"} ] 我试过了 if(this.query.length > 1){ rows = rows.filter(row=>row.label1.toLowerCase().includes(this.query)) } 但当我开始查询时,我需要搜索所有“rows[]”标签,而不仅仅是1个 差不多 rows =

我有这个

rows=[
  {label1 : "abc", label2 : "bcd"}, 
  {label3 : "cde", label4 : "dce"}
 ]
我试过了

if(this.query.length > 1){  
 rows = rows.filter(row=>row.label1.toLowerCase().includes(this.query))
}  
但当我开始查询时,我需要搜索所有“rows[]”标签,而不仅仅是1个 差不多

rows = rows.filter(row=>row.label1.toLowerCase().includes(this.query))&& 
   rows.filter(row=>row.label2.toLowerCase().includes(this.query))... etc

当我搜索字母“b”时,我希望得到例如label1和label2的结果,它们之间有一个共同的字母

你可以将
一些
对象混合。值
搜索对象中的所有值:

let行=[
{label1:“a”,label2:“b”},
{label3:“c”,label4:“d”}
]
函数findInValues(arr、过滤器){
返回arr.filter(obj=>Object.values(obj).some(v=>v.includes(filter)))
}
log(findInValues(行'd'))
log(findInValues(行,'a'))

log(findInValues(rows,'notHere'))
您希望它过滤所有键。我假设你之前不知道这些键,因为你只需要在过滤条件下硬编码。即

rows=[
  {label1 : "a", label2 : "b"}, 
  {label3 : "c", label4 : "d"}
 ]

if (this.query) {
  rows = rows.filter(row => row.label1.toLowerCase().includes(this.query) || row.label2.toLowerCase().includes(this.query))
}
如果需要动态,可以对对象的键数组使用
some
方法()。试着这样做:

rows=[
  {label1 : "a", label2 : "b"}, 
  {label3 : "c", label4 : "d"}
 ]

if (this.query) {
  rows = rows.filter(row => Object.keys(row).some(k => row[k].toLowerCase().includes(this.query))
}

注意:我看到有人打了我一拳,。因为他们把逻辑抽象成函数,而这一个没有,所以我会继续。也许这有助于理解逻辑。

您可以实现二进制搜索。这是基本的,但您可以修改
filterRecord
以递归方式工作

更新:我为嵌套树创建了

const操作数=['和','或'];//不用
//您需要将字符串转换为二叉树或使用下面的二叉树。
var rawQuery='label3=“c”和label4=“d”;
变量查询={
“和”:{
“label3”:“c”,
“label4”:“d”
}
}
风险值数据=[
{label1:“a”,label2:“b”},
{label3:“c”,label4:“d”}
];
日志(过滤(数据、查询));
函数过滤器(数据、查询){
返回查询!=null?数据。过滤器(记录=>filterRecord(记录,查询)):数据;
}
函数filterRecord(记录、查询){
返回Object.key(查询).some((操作数)=>{
var args=Object.keys(查询[操作数]);
var leftKey=args[0];
var leftVal=query[operand][args[0]];//添加检查对象和递归
var rightKey=args[1];
var rightVal=query[operand][args[1]];//添加检查对象和递归
变量字段=Object.keys(记录);
开关(操作数){
案例“或”:
if(fields.includes(leftKey)| | fields.includes(righkey)){
返回记录[leftKey]==leftVal | |记录[rightKey]==rightVal;
}
案例“和”:
if(字段包括(左键)和字段包括(右键)){
返回记录[leftKey]==leftVal&&record[rightKey]==rightVal;
}
}
返回false;
});
}

.as console wrapper{top:0;max height:100%!important;}
请发布您的预期输出。目前看来这将是一个例外,数组中的某些元素没有label1,那么row.label1.toLowerCase()就不好了。我得到TypeError:v.includes不是函数:(@BryanLesai您是在代码片段中还是在自己的代码中(或两者)发现了错误?听起来您可能在一个没有现代JS所有好处的环境中工作。如果您在一个不寻常的环境中工作(可能是谷歌应用程序脚本),你应该在问题中提到它,也许有人会有一个很好的解决办法。我想问题是我给出了一个基本的例子…但在我的真实代码中,我有一个对象数组,其中一些对象也包含另一个对象…这就是为什么我会出现错误的原因:/Yeah@BryanLesai,这使事情变得更复杂了。仍然你可能可以用一个相对简单的递归函数做一些事情(如果你在这里搜索归档文件,你可能会找到一些好的例子)。回答得很好。您应该调整输入,使程序看起来像在做什么。在当前示例中,输出与输入相同。@user633183已更新,谢谢。我实际上正在尝试创建递归解决方案。主要问题是,我将面临这样的问题:从查询字符串创建二元搜索树…我这就是为什么我忽略了它。@user633183我在这里创建了一个使用嵌套树的递归版本。