尝试围绕我应该如何处理过滤对象数组并仅返回满足所有标记的结果。
标记可以是任何字段 - fname
/ lname
/ email
/ position
/ etc
let search_tags = ['CEO', 'Steven'];
let contacts = [
{ fname: 'Steve', lname: 'Johnson', email: 'user@domain.com', position: 'CEO' },
{ fname: 'James', lname: 'Laurence', email: 'boss@domain.com', position: 'CFO' }
]
let results = contacts.filter((contact) => {
if (search_tags.includes(contact.fname) ||
search_tags.includes(contact.lname) ... ) {
return contact;
}
}
为简洁起见,我缩短了一些代码,显然此解决方案会返回与任何 search_tag
匹配的联系人,但是......我只需要返回满足每个的结果 search_tag
。
这是漫长的一天,我没有人谈论这个,所以我希望有人可以指出我正确的方向或给我啊哈! 时刻我希望:)
提前致谢!
答案 0 :(得分:0)
如果您想要返回与您希望使用的&&
而不是||
相匹配的每个搜索代码,但仍然会留下一堆详细且重复的代码
您可以使用Object.values()https://mdn.io/objectvalues代替直接在联系人对象上操作,这将为您提供['steve', 'johnson', 'user@domain]
...等数组。
然后你可以在你的过滤器中:
contacts.filter((contact) => {
const contactValues = Object.values(contact);
// Return the search item if at least one item matches
// Would return true if at least one item matches
return contactValues.some(value => search_tags.includes(value));
// return true only if all search tags match
return contactValues.every(value => search_tags.includes(value));
}
Object.values
是一项非常新的功能,因此,如果您没有在babel中使用它,那么您可以使用Object.keys
并使用contact[someKey]
答案 1 :(得分:0)
Array.prototype.filter()
可以与Array.prototype.every()
,Object.values()
和Array.prototype.includes()
结合使用构建Array
matches
个contact
,仅由{{1}组成} Objects
包含value
中每个element
的匹配search_tags
。
请参阅下面的实例。
// Search Tags.
const search_tags = ['CEO', 'Steven']
// Contacts.
let contacts = [
{ fname: 'Steven', lname: 'Johnson', email: 'user@domain.com', position: 'CEO' },
{ fname: 'James', lname: 'Laurence', email: 'boss@domain.com', position: 'CFO' }
]
// Matches.
const matches = contacts.filter((contact) => search_tags.every((tag) => Object.values(contact).includes(tag)))
// Log.
console.log(matches)

答案 2 :(得分:0)
小心()=>
“ Arrow functions ”即使在某些现代浏览器中也具有非常弱的浏览器兼容性......它不适用于所有IE版本,所有Blackberry和ALL Opera Mini for mobiles也是android< 4.4,特别是 Safari ,你不能pollyfill这个功能不幸。
所以我建议您使用Object.keys()
和map()
:
var contacts = [
{ fname: 'Steve', lname: 'Johnson', email: 'user@domain.com', position: 'CEO' },
{ fname: 'James', lname: 'Laurence', email: 'boss@domain.com', position: 'CFO' },
{ fname: 'random', lname: 'random2', email: 'random@g.com', position: 'user' }],
contacts_query = function( search_tags ){
//### the result will be stored here :
var resultArray = [];
// your contact Lists are using Numbers as keys like a Database :
// 1 {...} , 2 {...} , 3 {...} so we need to loop throw those numbers first :
for( var i in contacts ){ var contactsTable = contacts[ i ];
//@ mapping the contacts tables using their keys .
Object.keys( contactsTable ).map( function( keys ){
for( var y in search_tags ) // now we deal with search tags
if( search_tags[ y ] == contactsTable[ keys ] )
resultArray.push( contactsTable );
});
} return resultArray };
//### usage :
var query = contacts_query(['James', 'random@g.com']);
console.log( query );
这将为您提供每个contactList包含
中的一个或多个值search_tags[]
你也可以在上一个函数中使用( Object.values
):
Object.values( contactsTable ).map( function( values ){ ...
然后使用:
匹配结果 if( search_tags[ y ] == values ) ....
答案 3 :(得分:0)
ES6:
function filterIt(arr, searchKeys) {
return arr.filter(obj => Object.keys(obj).some(key => searchKeys.includes(obj[key])));
}