我有这个对象:
this.contacts = [
{
name: "",
el: ["one", "two"]
},
{
name: "",
el: ["three", "four"]
}]
如何过滤以上内容,例如,当我搜索"两个"?
时,只返回第一个对象到目前为止我的尝试:
filterItems(searchTerm) {
return this.contacts.filter((item) => {
return item.el.filter((user) => {
return user.toLowerCase().indexOf(searchTerm.toLowerCase()) > -1;
})
});
}
当然没有任何回报,为什么?
答案 0 :(得分:2)
您可以使用Array#includes
并将其视为过滤条件。
function filterItems(user) {
return this.contacts.filter(item => item.el
.map(s => s.toLowerCase())
.includes(user.toLowerCase()))
}
var contacts = [{ name: "", el: ["one", "two"] }, { name: "", el: ["thrEE", "four"] }];
console.log(filterItems('THREE'));

.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 1 :(得分:1)
在第一个.filter
内,你应该使用.some
var contacts = [{
name: "",
el: ["one", "two"]
},
{
name: "",
el: ["three", "four"]
}
]
filterItems = function(searchTerm) {
return contacts.filter((item) => {
return item.el.some((user) => {
return user.toLowerCase().indexOf(searchTerm.toLowerCase()) > -1;
})
});
}
console.log(filterItems("two"))
.as-console-wrapper { max-height: 100% !important; top: 0; }
答案 2 :(得分:0)
如果您希望获得类似的效果,但通过使用循环,您可以使用以下功能:
function filterItems(search) {
for(let i = 0; i < this.contacts.length; i++) {
let obj = this.contacts[i];
for(let j = 0; j < obj.el.length; j++) {
if(obj.el[j] === search) return i;
}
}
}
console.log(filterItems("two")); // logs 0 (returns 0)
console.log(filterItems("four")); // logs 1 (returns 1)
基本上,第一个循环用于遍历您的contacts数组。然后第二个用于遍历el
属性中的数组。然后在el
数组的每次迭代时,我们可以检查我们当前所在的数组元素是否等于传递search
值,因此如果匹配则返回true
工作示例:https://jsfiddle.net/knLbL9b5/(检查控制台输出)