你能复合过滤器的例子吗?

时间:2017-07-15 06:45:49

标签: javascript angularjs

你们能给我一些关于下一个任务的例子或链接:

Fragment fragment = SearchActivity.newInstance(context);
String tag = fragment.toString();
getFragmentManager().beginTransaction()
.addToBackStack(tag)       
.replace(R.id.fragment, new SearchActivity())
.commit();

var companies = [{
        members: [{
                name: 'John'
            },
            {
                name: 'Victor'
            },
            {
                name: 'Roan'
            }
        ]
    },
    {
        members: [{
                name: 'John'
            },
            {
                name: 'Roan'
            }
        ]
    }
]

当我输入“John and Victor”时 - 我希望得到公司[0]对象

当我输入“John而不是Victor”时 - 我希望得到公司[1]对象

QUESTION是如何解析文本并使其理解AND和NOT的位置? 希望我解释得很好。 提前谢谢你,祝你有愉快的一天!

2 个答案:

答案 0 :(得分:1)

这是精细名称而非名称的功能。您可以自己过滤数组。

    function searchCompanies(text) {
        var nameand = [],
            namesNot = [];
        text = text.replace(/\s\s+/g, ' '); //remove multiple whitespace
        var words = text.split(' ');
        for (var i = 0; i < words.length; i++) {
            var word = words[i].toLowerCase();
            if (i == 0)
                text.push(words[i]);
            else if (word != 'and' && word != 'not') {
                if (words[i - 1].toLowerCase() != 'not')
                    text.push(words[i]);
                else
                    namesNot.push(words[i]);
            }
        }
    }

答案 1 :(得分:0)

您想要解析文本并根据它运行代码。这可能会变得棘手,因此我们的目标是将系统规则缩小到尽可能简单。

在这种情况下,一个问题是我们需要将名称与andnot等关键字区分开来。我们可以维护一个像const keywords = ['and', 'not']这样的列表,并将那个不在该列表中的任何内容视为名称。区分大小写怎么样? And应该被视为名称,因为它是大写的吗?资本化是区分名字和非名字的便捷方式。

这只是冰山一角。

但是,好吧,让我们假设问题就像说明的那样简单。我们只想达到最低限度的目标。我将假设应包含所有名称,not是唯一真正有意义的关键字。我将排除所有以not开头的名称。

// Extremely naive, not suitable for production. Will get
// tricked by whitespace and other simple things.
const isName = (str) => {
    return str[0] === str[0].toUpperCase();
};

const input = document.querySelector('input[type="text"]');
input.addEventListener('change', (evt) => {
    const tokens = evt.target.value.split(' ');
    const names = tokens.filter((name, i, arr) => {
        return isName(name) && arr[i - 1] !== 'not';
    });
    const company = {
        members : names.map((name) => {
            return { name };
        })
    };
});