I want to filter two obj from the collections, the conditionArr fetch from Server, so it's unpredictable.
My code is:
var users = [{
user: 'barney',
age: 36,
active: true
},
{
user: 'fred',
age: 40,
active: false
},
{
user: 'travis',
age: 37,
active: true
}
];
// the Array fetch from Server, so it's unpredictable.
var conditionArr = [{
user: 'barney'
}, {
user: 'fred'
}];
// _.filter
result = _.filter(users, conditionArr);
My expected output:
// expect results:
[{
user: 'barney',
age: 36,
active: true
},
{
user: 'fred',
age: 40,
active: false
}
]
real results:
[]
thx.
I found a better method:
result = _.map(conditionArr, (con) => ({
...con,
...(_.find(users, { user: con.user })),
}))
thx...
I want to filter two obj from the collections, the conditionArr fetch from Server, so it's unpredictable.
My code is:
var users = [{
user: 'barney',
age: 36,
active: true
},
{
user: 'fred',
age: 40,
active: false
},
{
user: 'travis',
age: 37,
active: true
}
];
// the Array fetch from Server, so it's unpredictable.
var conditionArr = [{
user: 'barney'
}, {
user: 'fred'
}];
// _.filter
result = _.filter(users, conditionArr);
My expected output:
// expect results:
[{
user: 'barney',
age: 36,
active: true
},
{
user: 'fred',
age: 40,
active: false
}
]
real results:
[]
thx.
I found a better method:
result = _.map(conditionArr, (con) => ({
...con,
...(_.find(users, { user: con.user })),
}))
thx...
Share Improve this question edited Apr 12, 2020 at 3:37 Penny Liu 17.4k5 gold badges86 silver badges108 bronze badges asked Mar 23, 2018 at 11:36 ycjcl868ycjcl868 5583 gold badges7 silver badges19 bronze badges6 Answers
Reset to default 7Use _.intersectionBy()
:
const users = [{"user":"barney","age":36,"active":true},{"user":"fred","age":40,"active":false},{"user":"travis","age":37,"active":true}];
const conditionArr = [{"user":"barney"},{"user":"fred"}];
const result = _.intersectionBy(users, conditionArr, 'user');
console.log(result);
<script src="https://cdnjs.cloudflare./ajax/libs/lodash.js/4.17.5/lodash.min.js"></script>
Vanilla JS - I've added a simple intersectionBy()
that converts the relevant key
values of the 2nd array to a Set. Then you can filter the 1st array using the Set.
const intersectionBy = (arr1, arr2, key) => {
const keys = new Set(arr2.map(o => o[key]));
return arr1.filter(o => keys.has(o[key]));
};
const users = [{"user":"barney","age":36,"active":true},{"user":"fred","age":40,"active":false},{"user":"travis","age":37,"active":true}];
const conditionArr = [{"user":"barney"},{"user":"fred"}];
const result = intersectionBy(users, conditionArr, 'user');
console.log(result);
Just use array.filter:
var users = [
{ user: 'barney', age: 36, active: true },
{ user: 'fred', age: 40, active: false },
{ user: 'travis', age: 37, active: true}
];
var result = users.filter(({user}) => user === 'barney' || user === "fred");
console.log(result);
Like many other lodash functions, _.filter takes function as 2nd parameter (with each element in array as a parameter), if the function return true, then that element is kept in the result.
var users = [
{ user: 'barney', age: 36, active: true },
{ user: 'fred', age: 40, active: false },
{ user: 'travis', age: 37, active: true }
];
// the Array fetch from Server, so it's unpredictable.
var conditionArr = [
{ user: 'barney'},
{ user: 'fred'}
];
// Simplified condition a bit. cond = ['barney', 'fred'];
var cond = _.map(conditionArr, cond => cond.user);
// _.filter
var result = _.filter(users, user => _.indexOf(cond, user.user) !== -1);
console.log('result', result);
<script src="https://cdn.jsdelivr/npm/[email protected]/lodash.min.js"></script>
If you have to achieve this with lodash you can do in the same way like array.filter
_.filter(users, ({user}) => user === 'barney' || user === 'fred');
In _.filter method you need to pass function like below example
_.filter(users, function(o) { return !o.active; });
var users = [{
user: 'barney',
age: 36,
active: true
},
{
user: 'fred',
age: 40,
active: false
},
{
user: 'travis',
age: 37,
active: true
}
];
// _.filter
var result = _.filter(users, function(obj) { return obj.user=='barney'||obj.user=='fred' });
console.log(result)
<script src="https://cdnjs.cloudflare./ajax/libs/lodash.js/4.17.5/lodash.core.js"></script>
use native js like -
let userSubset = users.map(function(obj, index) {
if (obj.user === "barney" || obj.user === "fred") return obj;
}).filter(Boolean);
console.log(userSubset);
// {user: "barney", age: 36, active: true}
// {user: "fred", age: 40, active: false}