簡體   English   中英

在對象數組中查找數組中的元素

[英]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的回調函數中返回truefalse 例如, 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;
})

您可以使用filtersome 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM