javascript - 在多个字段上具有多个值的搜索过滤器

标签 javascript arrays filter

基本上,我需要返回 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;
        });
    });
}

有关 every 的更多信息和 some .

<小时/>

像箭头函数这样的 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/

相关文章:

javascript - 使用 openpgp 将 javascript 二进制文件解密为文本

c - 无指针双向圆阵算法

elasticsearch - elasticsearch需要在 bool 中添加一个必须的查询

filter - 剑道多选搜索全文搜索

python - 通过多个关键字过滤数据

javascript - 如何在 Ajax 调用中保留上下文

javascript - 同位素 - 组合按钮和 UI slider 不起作用

javascript - 如何在javascript中使用二维数组填充下拉列表

javascript - ng-click 没有触发工厂类

java - 从数组中找到最小值 - 我不明白