简体   繁体   中英

How do I filter an object with an object using Array.filter similar to lodash?

I am trying to avoid importing lodash for a simple filter. I am trying to do something similar to this...

// Items
[
  { "title": "a", "name": "a", "location": "here"},
  { "title": "b", "name": "a", "location": "here"}, 
  { "title": "d", "location": "there"}, 
]
// Filter
{ "name" : "a", "location": "here" }

Should return the first two items. In lodash this is done by something similar to _.filter(Items, Filter) . I would like to implement this without lodash or a bunch of code and getting Object.keys . Is there a simple way in modern Javascript to handle this?

Here's what I came up with, seems to work well

 let foo = [ { "title": "a", "name": "a", "location": "here"}, { "title": "b", "name": "a", "location": "here"}, { "title": "d", "location": "there"}, ]; let bar = { "name": "a", "location": "here" }; let result = foo.filter(obj => Object.entries(bar).every(([k,v]) => obj[k]===v) ); console.log(result);

I don't believe there's a "simple way in modern Javascript to handle this" but if you don't have a hard requirement on avoiding Object.keys you could write a helper function to do this:

 const myItems = [ { "title": "a", "name": "a", "location": "here"}, { "title": "b", "name": "a", "location": "here"}, { "title": "d", "location": "there"}, ] const myFilter = { "name": "a", "location": "here" }; const filter = (items, filterBy) => items.filter(item => Object.keys(filterBy).every(key => item[key] === filterBy[key]) ) alert(JSON.stringify(filter(myItems, myFilter)));

You could get the entries of the filter in advance to prevent getting th entries for every filtering iteration.

 const filter = (array, filter) => { const filterBy = entries => o => entries.every(([k, v]) => o[k] === v); return items.filter(filterBy(Object.entries(filters))); }, items = [{ title: "a", name: "a", location: "here" }, { title: "b", name: "a", location: "here" }, { title: "d", location: "there"}], filters = { name: "a", location: "here" }, result = filter(items, filters); console.log(result);
 .as-console-wrapper { max-height: 100%;important: top; 0; }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM