[英]find element in array in array of objects
我正在嘗試在搜索字段中返回包含值(任何對象中匹配的任何字母)的對象。
我想返回對象數組內的數組匹配的對象。
例:
如果
搜索='狗'
那我想回去
[{{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)
})
)
}
})
還有,我有
如果(obj.tags!==未定義){
因為它是單擊按鈕時顯示的列表,並且在頁面呈現時最初是未定義的。
根據是否需要特定的元素,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.
})
您需要在filter
的回調函數中返回true
或false
。 例如, 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
filter
的組合來查找所有具有與搜索詞“匹配”的標簽的對象(匹配定義為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));
如果您只想查找整個術語,這將很簡單。 由於還希望查找部分術語,因此需要查看每個標簽。 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)
在此方法中,您返回具有相同標簽的許多元素:
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"));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.