我正在为我的对象数组创建一个搜索过滤器,所以假设我有一个对象数组
let arr = [{'name': 'mn zx abc'}, {'name': 'zx mn'}, {'name': 'mnzx'}]
现在,如果我搜索zx
,它将返回类似
[{'name': 'mn zx abc'}, {'name': 'zx mn'}]
请注意比上一个对象{'name': 'mnzx'}
zx
介于两者之间,所以我不希望那样,希望您理解我的问题
这是代码-
let arr = [{'name': 'mn zx abc'}, {'name': 'zx mn'}, {'name': 'mnzx'}];
let searchedTerm = 'zx';
let result = arr.filter(data => {
if (data.name.charAt(0) === searchedTerm.charAt(0)) {
return true;
}
});
console.log(result);
答案 0 :(得分:0)
您似乎正在尝试识别名称字符串包含特定“单词”而不是特定字符的对象。
一种简单的解决方法是将名称字段拆分为单词,然后检查搜索词的拆分列表。如果您的单词由空格分隔,则可以执行"mn zx abc".split(/\s+/)
以获取["mn", "zx", "abc"]
。 /\s+/
是一个正则表达式,可匹配一个或多个空格字符,因此在此上进行拆分将使我们仅剩下一组非空格字符。
然后我们可以使用indexOf
检查列表中搜索词的存在。
这是一个完整的例子:
function matches(obj, searchTerm) { return obj.name.split(/\s+/).indexOf(searchTerm) >= 0; }
let arr = [{'name': 'mn zx abc'}, {'name': 'zx mn'}, {'name': 'mnzx'}];
let result = arr.filter(obj => matches(obj, "zx"));
答案 1 :(得分:0)
我会使用正则表达式来处理它...
// Your original array
let arr = [{'name': 'mn zx abc'}, {'name': 'zx mn'}, {'name': 'mnzx'}]
// Your original search term
let searchedTerm = 'zx';
// A new RegExp object which looks for your search term with a space before it (with case-insensitivity)
let searchRE = new RegExp(" " + searchedTerm, "i");
let result = arr.filter(data => {
// Test to see if your data.name (with an additional space before it) matches
return searchRE.test(" " + data.name);
});
console.log(result);
答案 2 :(得分:0)
您可以在array#filter
中使用带有单词边界的正则表达式来获取全部name
和zx
。
let arr = [{'name': 'mn zx abc'}, {'name': 'zx mn'}, {'name': 'mnzx'}],
searchedTerm = 'zx',
result = arr.filter(({name}) => new RegExp( `\\b${searchedTerm}\\b`, "i").test(name));
console.log(result);
答案 3 :(得分:0)
您可以使用RegExp.test()
对单词边界为(\b)
的数组进行过滤:
let arr = [{'name': 'mn zx abc'}, {'name': 'zx mn'}, {'name': 'mnzx'}, {'name': 'zxmn'}, {'name': 'abczx mn'}];
const output = arr.filter(obj => /\bzx\b/.test(obj.name));
console.log(output);