按多个字符串过滤对象数组

时间:2018-03-01 02:23:38

标签: javascript arrays filtering javascript-objects

尝试围绕我应该如何处理过滤对象数组并仅返回满足所有标记的结果。

标记可以是任何字段 - 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

这是漫长的一天,我没有人谈论这个,所以我希望有人可以指出我正确的方向或给我啊哈! 时刻我希望:)

提前致谢!

4 个答案:

答案 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 matchescontact,仅由{{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])));
}