簡體   English   中英

通過多個字符串過濾對象數組

[英]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的匹配valuecontact 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.

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