基本上,我需要返回 true/false 的代码,判断是否在 Javascript 对象的 3 个字段中找到所有搜索字符串(以过滤 ListView )。
此代码将为 ListView 的每个元素执行,以确定它是否应该保留在列表中或被过滤掉。每个元素包含 3 个字段(PONUM、DESCRIPTION 和 VENDOR)。用户可以在文本框中键入一个或多个搜索词,我想确保键入的每个词至少出现在其中一个字段中。
元素列表示例:
[ROW] | PONUM | DESCRIPTION | VENDOR
1 | PO10 | ABC | ABCCOMPANY
2 | PO11 | DEF | ABCCOMPANY
3 | PO12 | GHI | XYZCOMPANY
4 | PO20 | JKL | XYZCOMPANY
如果我输入以下过滤器:PO1 ABC
我应该看到第 1 行和第 2 行,但不是第 3 行 (第 1 行和第 2 行的 3 列中至少有一列找到了“PO1”和“ABC”,第 3 行找到了“PO1”,但没有在任何列中找到“ABC”)
如果我输入:PO1 XYZ
,我应该只会看到第 3 行。
如果我输入:PO2 ABC
,我应该什么也看不到。
至于代码本身,我有一个搜索词数组(我输入输入的文本并将其拆分为空格),称为 searchTerms
。每个字段的值通过使用 item.Attributes.[fieldname].content 来访问,例如 item.Attributes.PONUM.content
等。
我尝试了以下递归方法,理论上该方法应该有效,但我在浏览器中收到“最大堆栈调用”错误。
function search(searchTerms,x,item) {
if(x < 0) {
return true;
}
if(item.Attribute.PONUM.content.indexOf(searchTerms[x] != -1) {
return search(searchTerms,x--);
}
if(item.Attribute.DESCRIPTION.content.indexOf(searchTerms[x] != -1) {
return search(searchTerms,x--);
}
if(item.Attribute.VENDOR.content.indexOf(searchTers[x]) != -1) {
return search(searchTerms,x--)
}
return false;
}
//Function is called like this:
return search(searchTerms,searchTerms.length-1,item)
基本上它会(向后)遍历搜索词。如果它在其中一个字段中找到它,它会再次调用搜索,并使用下一个搜索项 (x--)。如果没有找到,它会立即返回 false(该项目现在将被过滤)。如果它继续在其中一个字段中查找每个搜索词,它最终将达到 -1(搜索词结束)并返回 true,因为它在其中一个字段中找到了所有搜索词。
或者至少我认为我的函数应该这样做;)
非常感谢任何和所有帮助!
最佳答案
稍微不同的方法可能会产生更干净的解决方案:
function search(terms, item) {
return terms.every(function(term) {
return ['PONUM', 'DESCRIPTION', 'VENDOR'].some(function(attribute) {
return item.Attributes[attribute].indexOf(term) !== -1;
});
});
}
<小时/>
像箭头函数这样的 ES6 功能可以提供更好的语法:
const search = (terms, item) =>
terms.every(term =>
['PONUM', 'DESCRIPTION', 'VENDOR']
.some(attribute => item.Attributes[attribute].includes(term));
);
关于javascript - 在多个字段上具有多个值的搜索过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42012404/