![](/img/trans.png)
[英]Typescript Filter Array of Objects with an Array of Strings by Multiple Keywords
[英]Filter array of objects by multiple strings
試圖使我的大腦陷入如何處理過濾對象數組,只返回滿足所有標簽的結果的問題 。
標簽可以是任何字段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
結果。
這是漫長的一天,我沒有人可以談論這個,所以我希望有人可以向我指出正確的方向,或者給我那個啊哈! 我希望的時刻:)
提前致謝!
如果您想返回一個與每個搜索標簽匹配的標簽,則要使用&&
而不是||
但這仍然給您留下了一堆冗長和重復的代碼
您可以使用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]
獲取值
Array.prototype.filter()
可以與Array.prototype.every()
, Object.values()
和Array.prototype.includes()
以構造一個matches
Array
,該matches
Array
僅由包含每個Objects
的匹配value
的contact
Objects
組成search_tags
element
。
請參見下面的實際示例。
// 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)
小心()=>
“ 箭頭函數 ”即使在某些現代瀏覽器中也具有非常弱的瀏覽器兼容性...它不適用於所有IE版本,用於手機的ALL Blackberry和ALL Opera Mini以及android <4.4,尤其是Safari ,並且您無法對此功能進行輪詢。不幸的是。
所以我建議你使用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 ) ....
ES6:
function filterIt(arr, searchKeys) {
return arr.filter(obj => Object.keys(obj).some(key => searchKeys.includes(obj[key])));
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.