search: (query) => {
const websites = cloneDeep(this.state.websites);
let results = [];
websites.forEach(object => {
let isResult = false;
const searchIn = ["code", "link", "offline", "online"];
for(let prop = 0; prop < 4; prop++) {
if(isResult) break;
const propVal = object[searchIn[prop]];
if(typeof propVal === "string" && propVal !== "undefined") {
if(propVal.toLowerCase().indexOf(query.toLowerCase()) !== -1) {
isResult = true; }
}
}
if(isResult) results.push(object);
});
}
p.s。我有一个对象数组。我需要检查每个对象的四个属性中是否至少有一个匹配。 “查询” =子字符串。
答案 0 :(得分:1)
您正在使事情复杂化,方法是使用forEach
遍历对象,然后迭代所有object
键以检查它是否为搜索到的属性之一,并且其值是否包含搜索了query
字符串。
您的函数没有返回任何东西,因为您只是尝试填充results
数组而不返回它。
解决方案:
您可以简单地使用 Array#filter()
method 过滤websites
数组,然后在其中使用 Array#some()
method遍历searchIn
属性数组,并检查每个object
的相对属性以及它们的值是否包含搜索到的query
字符串。
这应该是您的代码:
const searchIn = ["code", "link", "offline", "online"];
search: (query) => {
query = query.toLowerCase()
websites.filter(o => searchIn.some(k => o[k] && typeof o[k] === "string" && o[k].toLowerCase().indexOf(query) > -1));
}