在对象数组中查找数组中的元素

问题描述 投票:0回答:5

我正在尝试返回包含搜索字段中的值(任何对象中匹配的任何字母)的对象。

我想返回对象数组中的数组匹配的对象。

例:

如果

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){

因为它是一个单击按钮时显示的列表,并且在页面渲染时最初未定义。

javascript reactjs
5个回答
1
投票

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.
})

0
投票

你需要在true的回调函数中返回falsefilter。例如,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;
})

0
投票

您可以使用filtersome的组合来查找具有与搜索项“匹配”的标记的所有对象(匹配定义为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));

0
投票

在此方法中,您返回许多具有相同标记的元素:

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"));

0
投票

如果您只是想找到整个术语,这将很简单。由于您也想查找部分术语,因此您需要查看每个标记。 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)
© www.soinside.com 2019 - 2024. All rights reserved.