我正在尝试返回包含搜索字段中的值(任何对象中匹配的任何字母)的对象。
我想返回对象数组中的数组匹配的对象。
例:
如果
search ='dog'
然后我想回来
[{name:Jake,last:DK,tags:['fun','dog','cat']}]
或者如果
search ='a'return [{name:Jake,last:DK,tags:['fun','dog','cat']},{name:John,last:Hop,tags:['boring','捕鼠器']}]
我的尝试:
this.state = {
search = '',
arr = [{name: Jake, last: DK, tags: ['fun','dog','cat']},
{name: John, last: Hop, tags: ['boring','mouse','trap']}]
}
//asuming the arr is stored in state
let filteredTag = this.state.arr.filter(obj => {
if (obj.tags !== undefined) {
return (
obj.tags.filter(tag => {
return tag.includes(this.state.search)
})
)
}
})
还有,我有
if(obj.tags!== undefined){
因为它是一个单击按钮时显示的列表,并且在页面渲染时最初未定义。
filter的返回值应该为true / false,具体取决于您是否需要特定元素。考虑到这一点,您需要进行以下更改。
let filteredTag = this.state.arr.filter(obj => {
if (obj.tags !== undefined) {
return (
obj.tags.filter(tag => {
return tag.includes(this.state.tagSearch)
}).length > 0 // since if tag has any element matching,filtered tags length can be checked
)
}
return false // since in undefined case,search condition is not met.
})
你需要在true
的回调函数中返回false
或filter
。例如,student.tags.filter(
具有正确的回调函数,因为它返回true或false。但是,this.state.arr.filter(obj => {
不返回布尔值。以下是它应该如何改变:
//asuming the arr is stored in state
let filteredTag = this.state.arr.filter(obj => {
if (obj.tags === undefined) return false;
var result = student.tags.filter(tag => {
return tag.includes(this.state.tagSearch)
});
return result.length > 0;
})
您可以使用filter
和some
的组合来查找具有与搜索项“匹配”的标记的所有对象(匹配定义为tag.includes(term)
):
function search(term, arr) {
return (arr || []).filter(e => (e.tags || []).some(t => t.includes(term)));
}
var data = [{
name: 'Jake',
last: 'DK',
tags: ['fun', 'dog', 'cat']
},
{
name: 'John',
last: 'Hop',
tags: ['boring', 'mouse', 'trap']
}
];
console.log(search('dog', data));
console.log(search('a', data));
console.log(search('dog', undefined));
在此方法中,您返回许多具有相同标记的元素:
var arr = [{name: 'Jake', last: 'DK', tags: ['fun','dog','cat']},
{name: 'John', last: 'Hop', tags: ['boring','mouse','trap']},
{name: 'Demian', last: 'Bibiano', tags: ['dog','cat','trap']}];
function search(searchText){
var ret = []
arr.forEach(function (element){
if(element.tags.includes(searchText)){
ret.push(element)
}
})
return ret;
}
console.log(search("dog"));
如果您只是想找到整个术语,这将很简单。由于您也想查找部分术语,因此您需要查看每个标记。 some()
对此非常有用,因为你可以设置一个条件并重新设置一个布尔值,这就是你需要的:
let arr = [{name: 'Jake', last: 'DK', tags: ['fun','dog','cat']},
{name: 'John', last: 'Hop', tags: ['boring','mouse','trap']}]
let term = 'dog'
let found = arr.filter(item =>
/* return a boolean here */
/* && will short circuit returning false if there's no tags */
/* some will return true if any word contains term */
item.tags && item.tags.some(word => word.includes(term))
)
console.log(found)
// also works with `a`
term = 'a'
found = arr.filter(item =>
item.tags && item.tags.some(word => word.includes(term))
)
console.log(found)