Filtering array of objects with lodash based on property value

JavascriptFilterFilteringLodash

Javascript Problem Overview


We have an array of objects as such

var myArr = [ {name: "john", age: 23},
              {name: "john", age: 43},
              {name: "jim", age: 101},
              {name: "bob", age: 67} ];

how do I get the list of objects from myArr where name is john with lodash?

Javascript Solutions


Solution 1 - Javascript

Use lodash _.filter method:

_.filter(collection, [predicate=_.identity])

Iterates over elements of collection, returning an array of all elements predicate returns truthy for. The predicate is invoked with three arguments: (value, index|key, collection).

with predicate as custom function

 _.filter(myArr, function(o) { 
    return o.name == 'john'; 
 });

with predicate as part of filtered object (the _.matches iteratee shorthand)

_.filter(myArr, {name: 'john'});

with predicate as [key, value] array (the _.matchesProperty iteratee shorthand.)

_.filter(myArr, ['name', 'John']);

Docs reference: https://lodash.com/docs/4.17.4#filter

Solution 2 - Javascript

Lodash has a "map" function that works just like jQuerys:

var myArr =  [{ name: "john", age:23 },
              { name: "john", age:43 },
              { name: "jimi", age:10 },
              { name: "bobi", age:67 }];

var johns = _.map(myArr, function(o) {
    if (o.name == "john") return o;
});

// Remove undefines from the array
johns = _.without(johns, undefined)

Solution 3 - Javascript

With lodash:
const myArr = [ {name: "john", age: 23},
                {name: "john", age: 43},
                {name: "jim", age: 101},
                {name: "bob", age: 67} ];

const johnArr = _.filter(myArr, person => person.name === 'john');
console.log(johnArr)

enter image description here

Vanilla JavaScript:
const myArr = [ {name: "john", age: 23},
                {name: "john", age: 43},
                {name: "jim", age: 101},
                {name: "bob", age: 67} ];
    
const johnArr = myArr.filter(person => person.name === 'john');
console.log(johnArr);

enter image description here

Solution 4 - Javascript

**Filter by name, age ** also, you can use the map function

> difference between map and filter

1. map - The map() method creates a new array with the results of calling a function for every array element. The map method allows items in an array to be manipulated to the user’s preference, returning the conclusion of the chosen manipulation in an entirely new array. For example, consider the following array:

2. filter - The filter() method creates an array filled with all array elements that pass a test implemented by the provided function. The filter method is well suited for particular instances where the user must identify certain items in an array that share a common characteristic. For example, consider the following array:

const users = [
    { name: "john", age: 23 },
    { name: "john", age:43 },
    { name: "jim", age: 101 },
    { name: "bob", age: 67 }
];

const user = _.filter(users, {name: 'jim', age: 101});
console.log(user);

Solution 5 - Javascript

<!-- begin snippet: js hide: false console: true babel: false -->

<!-- language: lang-js -->

let myArr = [
    { name: "john", age: 23 },
    { name: "john", age: 43 },
    { name: "jim", age: 101 },
    { name: "bob", age: 67 },
];

let list = _.filter(myArr, item => item.name === "john");

<!-- end snippet -->

Solution 6 - Javascript

let myArr = [
    { name: "john", age: 23 },
    { name: "john", age: 43 },
    { name: "jim", age: 101 },
    { name: "bob", age: 67 },
];

// this will return old object (myArr) with items named 'john'
let list = _.filter(myArr, item => item.name === 'jhon');

//  this will return new object referenc (new Object) with items named 'john' 
let list = _.map(myArr, item => item.name === 'jhon').filter(item => item.name);

Solution 7 - Javascript

lodash also has a remove method

var myArr = [
    { name: "john", age: 23 },
    { name: "john", age: 43 },
    { name: "jim", age: 101 },
    { name: "bob", age: 67 }
];

var onlyJohn = myArr.remove( person => { return person.name == "john" })

Solution 8 - Javascript

Could do something like this to combine filter with an includes to see if the option includes a specific string (answerQuery in this case)

  return filter(answerOptions, (option) => {
    return includes(option.label.toLowerCase(), answerQuery.toLowerCase());
  });

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionsarsnakeView Question on Stackoverflow
Solution 1 - JavascriptEnver DzhaparoffView Answer on Stackoverflow
Solution 2 - JavascriptDustin PoissantView Answer on Stackoverflow
Solution 3 - JavascriptYuciView Answer on Stackoverflow
Solution 4 - JavascriptNver AbgaryanView Answer on Stackoverflow
Solution 5 - JavascriptNver AbgaryanView Answer on Stackoverflow
Solution 6 - JavascriptNver AbgaryanView Answer on Stackoverflow
Solution 7 - JavascriptNicole WheelerView Answer on Stackoverflow
Solution 8 - JavascriptJeremyView Answer on Stackoverflow